三剑客(1)

文本处理三剑客

grep
	文本过滤
sed
	流过滤
awk
	格式处理
正则表达式
	就是一些特殊字符组成的模式
正则表达式的作用

在企业工作中,我们每天做的linux运维工作中,时刻都会面对大量带有字符串的文本配置、程序、命令输出及日志文件等,而我们经常会有迫切的需要,从大量的字符串内容中查找符号工作需要特定的字符串。这就要靠正则表达式。因此,可以说正则表达式就是为过滤这样字符串的需求而生的!

1.Linux正则表达式grep,sed,awk
2.大量的字符串文件需要进行配置,而且是非交互式的
3.过滤相关的字符串,匹配字符串,打印字符串

正则表达式注意事项

1.正则表达式应用非常广泛,存在于各种语言中,例如:php,python,java等。
2.正则表达式和通配符特殊字符是有本质区别的。
3.要想学好grep、sed、awk首先就要掌握正则表达式。

通配符:
	1)*
		任意字符
[root@oldboy ~]# ls /etc/*host*
/etc/host.conf  /etc/hostname  /etc/hosts  /etc/hosts.allow  /etc/hosts.deny
	2)?

		任意单个字符
[root@oldboy ~]# ls /etc/host? 
/etc/hosts
	
3)[]
		范围
		[a-z] [A-Z] [0-9]
[root@oldboy re]# touch a asd1 ad23 akdjf9 d99 123  5431 13 df123 123adf AAA BBB A123 Aa21

[root@oldboy re]# ls
123  123adf  13  5431  A123  AAA  Aa21  BBB  a  ad23  akdjf9  asd1  d99  df123  re.txt

[root@oldboy re]# ls [a-z]
a

[root@oldboy re]# ls [0-9]
ls: cannot access [0-9]: No such file or directory

[root@oldboy re]# ls [0-9]*
123  123adf  13  5431

[root@oldboy re]# ls [0-9][0-9]
13

[root@oldboy re]# ls [0-9][0-9][0-9]
123

[root@oldboy re]# ls [0-9]*         
123  123adf  13  5431

[root@oldboy re]# ls [a-z]*
a  ad23  akdjf9  asd1  d99  df123  re.txt

[root@oldboy re]# ls [A-Z]*
A123  AAA  Aa21  BBB

[root@oldboy re]# ls *[A-Z]*[a-z]*[0-9]*
Aa21

[root@oldboy re]# ls [a-zA-Z0-9]*
123  123adf  13  5431  A123  AAA  Aa21  BBB  a  ad23  akdjf9  asd1  d99  df123  re.txt

	4){}
		序列
[root@oldboy re]# cp a{,.bak}

[root@oldboy re]# ls
A  B  a  a.bak  ab  b

===================================================================
特殊字符:
	""      可以引用特殊字符,比如$
	''      所见即所得
	``=$()  命令,优先执行
[root@oldboy re]# echo $name
tanfei

[root@oldboy re]# echo 'my name is $name'
my name is $name

[root@oldboy re]# echo "my name is $name"
my name is tanfei

[root@oldboy re]# echo my name is $name 
my name is tanfei

[root@oldboy re]# test="my name is $name"

[root@oldboy re]# echo $test
my name is tanfei

[root@oldboy re]# test1=echo my name is $name
-bash: my: command not found

	# 注释行;命令提示符身份
	$ 变量;命令提示符身份
	
	;  cmd1;cmd2 表示先执行cmd1,再执行cmd2
	&& cmd1 && cmd2,表示cmd1执行成功后,再执行cmd2
	|| cmd1 || cmd2,表示cmd1执行失败后,再执行cmd2
	
	!  
		取反 ,find
		history,调用之前使用的命令
		
	重定向
	<
	>
	>>
	2>
	2>>
	&>/dev/null
		1>/dev/null 2>&1
		1>/dev/null 2>/dev/null
	
	管道符
	|
	
	~ 家目录
	.
		当前目录
		在文件名前面,表示隐藏
		chown改属组
	..
		上一级目录
	-
		文件类型,普通文件
		cd - 进入上次目录
		su - 切换用户
	%
		定义格式
	+
		chmod 加属性
	
grep,默认以行为单位
命令选项:
	-i 忽略大小写
[root@oldboy re]# grep documentroot /etc/httpd/conf/httpd.conf 

[root@oldboy re]# grep DocumentRoot /etc/httpd/conf/httpd.conf 
# DocumentRoot: The directory out of which you will serve your
DocumentRoot "/var/www/html"
    # access content that does not live under the DocumentRoot.

[root@oldboy re]# grep -i documentroot /etc/httpd/conf/httpd.conf 
# DocumentRoot: The directory out of which you will serve your
DocumentRoot "/var/www/html"
    # access content that does not live under the DocumentRoot.

	--color=auto  高亮显示
		CentOS6默认没做别名,可以自己添加别名
	-o 详细过程,显示满足条件的字符
	-v 反向过滤
	-E egrep
	-q 静默输出
		不需要看命令输出,只通过命令执行状态来判断是否执行成功
	-n 显示行号

正则表达式:
	BRE:基础正则 
		grep
	ERE:扩展正则
		grep -E
		egrep
	
基础正则表达式	
字符匹配:
.:匹配任意单个字符;除开空行
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围外的任意单个字符(包括特殊符号);
	[a-z],[A-Z],[0-9],[a-z0-9],[abcxyz]
[[:upper:]]:所有大写字母 [A-Z]
[[:lower:]]:所有小写字母 [a-z]
[[:alpha:]]:所有字母     [a-zA-Z] [a-Z]
[[:digit:]]:所有数字     [0-9]
[[:alnum:]]:所有的字母和数字 [a-zA-Z0-9]
[[:space:]]:空白字符     
[[:punct:]]:所有标点符号
		
		
练习:
模板:
[root@oldboy re]# cat re.txt 
I am oldboy teacher!
I teach linux.
test

I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.oldboy.com
my qq num is 191868516.
not 191886888516.

案例1:验证'.',匹配任意单个字符,可以使用-o来验证
[root@oldboy re]# grep  '.' re.txt 
I am oldboy teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.oldboy.com
my qq num is 191868516.
not 191886888516.

案例2:验证[]里面无论写多少字符,都是或关系,只匹配单个字符
过滤出包含所有小写字母和数字连在一起的两个字符
grep '[a-z][0-9]' re.txt
过滤出包含所有小写字母或数字8的单个字符 
grep '[a-z8]' re.txt

匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;
	*:匹配其前面的字符任意次:0,1,多次;
		例如:grep "x*y"
			abxy、aby、xxxxxy、yab
	.*:匹配任意长度的任意字符;贪婪匹配
	\?:匹配其前面的字符0次或1次,也就是说其前面的字符是可有可无的;
	\+:匹配其前面的字符1次或多次,也就是说其前面的字符至少出现1次;
	\{m\}:匹配其前面的字符m次;
	\{m,n\}:匹配其前面的字符至少m次,至多n次;
	\{0,n\}:至多n次;
	\{m,\}:至少m次;


案例1:贪婪匹配
[root@oldboy re]# grep -o "8*" re.txt 
8
8
88
888
[root@oldboy re]# grep -o "8" re.txt 
8
8
8
8
8
8
8

过滤出所有字符数字连在一起的字符串
[root@oldboy re]# grep '[a-z0-9]*' re.txt -o

案例2:过滤身份证号
分析:身份证号18位,前17必须是数字,最后一位是数字或X
grep '[0-9]\{17\}[0-9xX]$'
egrep '[0-9]{17}[0-9xX]$' id.txt

位置锚定:
	^:行首锚定;用于模式的最左侧;
	$:行尾锚定;用于模式的最右侧;
	^PATTERN$:用PATTERN来匹配整行;
		^$:空白行;
		^[[:space:]]*$:空行或包含空白字符的行;
							
	单词:非特殊字符组成的连续字符串都称为单词;
	\<或\b:词首锚定,用于单词的左侧;
	\>或\b:词尾锚定,用于单词的右侧;
	\<PATHERN\>:匹配完整单词;

案例1:过滤以小写字母开头的行
grep '^[a-z]' re.txt
grep '^[[:lower:]]' re.txt

案例2:过滤出不是小写字母开头的行
grep '^[^a-z]' re.txt #不包含空行,推荐
grep -v '^[a-z]' re.txt
注意:如果^和$再[]里面,没特殊含义
grep '[a-z.^$]' re.txt

案例3:过滤以大写字母开头的行
grep '^[A-Z]' re.txt
grep '^[[:upper:]]' re.txt

案例4:过滤出以m结尾的行
grep 'm$' re.txt

查看文件内特殊字符:
[root@oldboy re]# cat -A re.txt 	

案例5.过滤出以.结尾的行
grep '\.$' re.txt
注意:.代表任意单个字符,所有要转义
grep '[.]$' re.txt  

案例6.过滤出非.结尾的行
grep '[^.]$' re.txt  
grep -v '[.]$' re.txt  

案例7:过滤出空行(空行意味着什么都没有),并列出行号
grep -n '^$' re.txt
上面的答案只能过滤空行,不能满足包含空格的行,下面才是正解
grep -n '^[[:space:]]*$' re.txt

案例8:过滤出非空行
grep -v '^[[:space:]]*$' re.txt
	
案例:
[root@oldboy re]# grep '\<oldboy\>' /etc/passwd
oldboy:x:1012:1012::/home/oldboy:/bin/bash
[root@oldboy re]# grep '\boldboy\b' /etc/passwd            
oldboy:x:1012:1012::/home/oldboy:/bin/bash


扩展正则:
相比标准正则的区别
grep -E
egrep

字符匹配:
	|:交替匹配|两边的任意一项ab(c|d)匹配abc或abd
	():匹配表达式,创建一个用于匹配的子串	
次数匹配:
	*:匹配其前面的字符任意次:0,1,多次;
	.*:匹配任意长度的任意字符;
	?:匹配其前面的字符0次或1次,也就是说其前面的字符是可有可无的;
	+:匹配其前面的字符1次或多次,也就是说其前面的字符至少出现1次;
	{m}:匹配其前面的字符m次;
	{m,n}:匹配其前面的字符至少m次,至多n次;
		{0,n}:至多n次;
		{m,}:至少m次;	
		
		
练习正则,最好的例子就是取IP
255.255.255.255

250-255  25[0-5]
200-249  2[0-4][0-9]
100-199  1[0-9][0-9]
10-99    [1-9][0-9]
0-9      [0-9]

[root@oldboy re]# ifconfig ens33 | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

基本正则练习:
1、找出/etc/passwd文件中的两位数或三位数的行;


2、找出/etc/rc.d/rc.sysinit文档中,至少一个空白字符开头,且后面非空白字符的行;

	
3、找出"netstat -ant"命令的结果中以"LISTEN"后跟0、1或多个空白字符结尾的行;

			
扩展正则练习:
1、找出/etc/passwd文件中的两位数或三位数的行;


2、找出/etc/rc.d/rc.sysinit文档中,至少一个空白字符开头,且后面非空白字符的行;

	
3、找出/proc/meminfo文件中,所有大写或小写s开头的行;至少有三种实现方式;


4、显示当前系统上root、CentOS或user1用户的相关信息;

	
5、找出/etc/init.d/functions文件中某单词后跟一个小括号的行;

						
6、找出ifconfig命令结果中的1-255之间的数值;
	

7、找出ifconfig命令结果中的IP地址;
CentOS6:
	ifconfig |sed -n 's#^.*r:\(.*\) Bc.*$#\1#gp'
CentOS7:
	ifconfig | awk 'NR==2{print $2}'

打赏

One Comment

  • 牛逼

Leave a Comment

电子邮件地址不会被公开。 必填项已用*标注