正则表达式:它使用单个字符串来描述或匹配一系列符合某个句法规则的字符串。
1、 grep/egrep工具的使用
命令格式:grep[-cinvABC] ‘word’ filename
其常用的选项如下:
-c:表示打印符合要求的行数
-i:表示忽略大小写
-n:表示输出符合要求的行及行号
-v:表示打印不符合要求的行
-A:后面跟一个数字(有无空格都可以),表示打印符合要求的行以及下面两行
-B:后面跟一个数字,表示打印符合要求的行以及上面两行
-C: 后面跟一个数字,表示打印符合要求的行以及上下各两行
实例1、过滤出带有某个关键词的行,并输出行号:
[root@localhost /]# grep -n 'root'/tmp/test/2.txt
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
过滤出含有关键词root的行,并输出了在第一行和第十行
实例2、过滤出不带有某个关键词的行,并输出行号:
[root@localhost /]# grep -nv'nologin' !$
grep -nv 'nologin' /tmp/test/2.txt
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
42:aming:x:1000:1000:aming:/home/aming:/bin/bash
43:user1:x:1001:1001::/home/user1:/bin/bash
44:user12:x:1002:1002::/home/user12:/bin/bash
过滤出不带有关键词nologin的行,并输出了行号。
实例3、过滤出所有包含数字的行;
[root@localhost /]# head -n5/tmp/test/2.txt |grep '[0-9]'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
实例4、过滤出所有不包含数字的行:
[root@localhost /]# grep -v '[0-9]'/tmp/test/2.txt
实例5、过滤掉所有以#开头的行:
root@localhost /]# cat !$
cat /tmp/test/3.txt
fasdfadsf
1232323
#fdfsadf
#ewrew
[root@localhost /]# grep -v '^#' !$
grep -v '^#' /tmp/test/3.txt
fasdfadsf
1232323
实例6、过滤掉所有空行和以#开头的行
[root@localhost /]# grep -v '^$'/tmp/test/3.txt |grep -v '^#'
fasdfadsf
1232323
在正则表达式中,^表示行的开始,$表示行的结尾,空行则可以用^$表示。^在[]内表示反向选择,在[]外表示定位在行首
[root@localhost /]# grep '^[^a-zA-Z]'!$
grep '^[^a-zA-Z]' /tmp/test/3.txt
1232323
#fdfsadf
#ewrew
^[^a-zA-Z]表示
[root@localhost /]# grep '[^a-zA-Z]'/tmp/test/3.txt
1232323
#fdfsadf
#ewrew
实例7、过滤出任意一个字符和重复字符:
[root@localhost /]# grep 'd.f'/tmp/test/3.txt
Fasdfadsf
.表示任意一个字符,重点是一个字符。表示把d和f之间任意一个字符过滤出来。
[root@localhost /]# grep 'aaa*' !$
grep 'aaa*' /tmp/test/3.txt
aaffff
aaaaaaaaaf
aaaf
[root@localhost /]# cat !$
cat /tmp/test/3.txt
fasdfadsf
1232323
#fdfsadf
#ewrew
FFFF
aaffff
afff
aaaaaaaaaf
f
aaaf
aaa*表示aa,aaa,aaa或者更多的a,或者零个a,就是没有1个a。
*表示零个或多个*前面的字符,没有1个。
[root@localhost /]# grep '.*'/tmp/test/3.txt |wc -l
16
.*表示零个或多个任意字符,空行也包含在内。
实例8、指定要过滤出的字符出现次数:
[root@localhost /]# grep 'a\{2\}' /tmp/test/3.txt
aaffff
aaaaaaaaaf
aaaf
[root@localhost /]# grep 'a\{3\}'/tmp/test/3.txt
aaaaaaaaaf
aaaf
符号{},其内部为数字,表示前面的字符要重复的次数。{}左右都需要加上转义字符\,另外使用{}还可以表示一个范围,具体格式{n1,n2},其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,这时表示大于等于n1次。
实例9、过滤出一个或多个指定的字符:
[root@localhost /]# egrep 'f+'/tmp/test/3.txt
fasdfadsf
#fdfsadf
aaffff
afff
aaaaaaaaaf
f
aaaf
aaaaaf
aaaaaaf
egrep使用符号+,表示匹配1个或多个+前面的字符,+是不支持grep的,{}也可以被egrep使用,而且不需要加\转义。使用符号?,表示匹配零个或一个指定的字符。
实例10、过滤出字符串1或者字符串2:
[root@localhost /]# egrep 'fa|af'/tmp/test/3.txt
fasdfadsf
aaffff
afff
aaaaaaaaaf
aaaf
aaaaaf
aaaaaaf
sed工具的使用:
实例1、打印某行:
格式:sed –n ‘n’p filename,单引号内的n是一个数字,表示第几行,-n的作用是只显示我们要打印的行,无关的内容不显示,如果去掉-n,则会把所有的行都打印出来:
[root@localhost /]# sed -n '2'p !$
sed -n '2'p /tmp/test/3.txt
1232323
也可以指定区间打印:
[root@localhost /]# sed -n '2,4'p/tmp/test/3.txt
1232323
#fdfsadf
#ewrew
实例2、打印包含某个字符串的行:
[root@localhost /]# sed -n '/af/'p/tmp/test/3.txt
aaffff
afff
aaaaaaaaaf
aaaf
aaaaaf
aaaaaaf
字符串两边要加/
重点:sed命令加上-e选项可以实现多个行为:
[root@localhost /]# sed -e '2'p -e'/F/'p -n /tmp/test/3.txt
1232323
FFFF
实例3、删除某些行:
[root@localhost /]# cat !$
cat /tmp/test/3.txt
fasdfadsf
1232323
#fdfsadf
FFFF
aaffff
afff
f
aaaf
aaaaaf
aaaaaaf
[root@localhost /]# sed '1'd !$
sed '1'd /tmp/test/3.txt
1232323
#fdfsadf
FFFF
aaffff
afff
f
aaaf
aaaaaf
aaaaaaf
这里参数d表示删除的动作,不仅可以指定删除的单行,还可以删除多行:
[root@localhost /]# sed '1,3'd/tmp/test/3.txt
FFFF
aaffff
afff
f
aaaf
aaaaaf
aaaaaaf
还可以删除匹配某个字符的行:
[root@localhost /]# sed '/FFF/'d/tmp/test/3.txt
fasdfadsf
1232323
#fdfsadf
aaffff
afff
f
aaaf
aaaaaf
aaaaaaf
还可以删除从某一行开始到文档最后一行:
[root@localhost /]# sed '7,$'d/tmp/test/3.txt
fasdfadsf
1232323
#fdfsadf
FFFF
aaffff
afff
实例4、替换字符或者字符串:
[root@localhost /]# sed '1,2s/1/2/g'!$
sed '1,2s/1/2/g' /tmp/test/3.txt
2222
2222323
上例中,参数s表示替换动作,参数g表示本行全局替换,注意是本行哦,如果不加g则只替换本行的第一个字符。
除了使用/作为分隔符外,还可以使用其他特殊字符,例如#和@。
删除文档中所有的数字:
[root@localhost /]# sed 's/[0-9]//g'!$
sed 's/[0-9]//g' /tmp/test/3.txt
#fdfsadf
FFFF
aaffff
afff
实例5、调换两个字符串的位置:
[root@localhost /]# sed '1,2s/\(fa\)\(.*\)\(fe\)/\3\2\1/' /tmp/test/3.txt
fe#fb#fc#fd#fa
ca#cb#cc#cd#ce
aaffff
afff
f
aaaf
aaaaaf
aaaaaaf
\(fa\)\(.*\)\(fe\)表示一整行的内容,()在sed中属于特殊符号,必须在前面加转义字符\,\(fa\)代表1,\(.*\)代表2,\(fe\)代表3,则调换为\3\2\1.
还可以常常在某一行前后增加指定内容,需使用&符号:
在前增加:
[root@localhost /]# sed '1,2s/^.*$/123&/'/tmp/test/3.txt
123fa#fb#fc#fd#fe
123ca#cb#cc#cd#ce
在后增加:
[root@localhost /]# sed '1,2s/^.*$/&123/' !$
sed '1,2s/^.*$/&123/' /tmp/test/3.txt
fa#fb#fc#fd#fe123
ca#cb#cc#cd#ce123
实例6、直接修改文件内容,使用-i选项:
[root@localhost /]# sed -i 's/#/:/g' !$
sed -i 's/#/:/g' /tmp/test/3.txt
[root@localhost /]# cat !$
cat /tmp/test/3.txt
fa:fb:fc:fd:fe
ca:cb:cc:cd:ce
awk工具的使用
实例1、截取文档中的某个段:
[root@localhost test]# cat 3.txt
fa:fb:fc:fd:fe
ca:cb:cc:cd:ce
aaffff
afff
f
aaaf
aaaaaf
aaaaaaf
[root@localhost test]# head -n2 3.txt |awk -F ':''{print $1}'
fa
ca
-F选项的作用是指定分隔符。如果不加-F选项,则以空格或者tab为分隔符。print为打印的动作,用来打印某个字段。$1为第一个字段,$2为第二个字段。但$0比较特殊,表示整行:
[root@localhost test]# head -n2 3.txt |awk -F ':''{print $0}'
fa:fb:fc:fd:fe
ca:cb:cc:cd:ce
实例2、匹配字符或者字符串:
[root@localhost test]# awk '/oo/' !$
awk '/oo/' 1.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
setroubleshoot:x:994:991::/var/lib/setroubleshoot:/sbin/nologin
更强大的匹配,如下所示:
[root@localhost test]# awk -F ':' '$1 ~/oo/' !$
awk -F ':' '$1 ~/oo/' 1.txt
root:x:0:0:root:/root:/bin/bash
setroubleshoot:x:994:991::/var/lib/setroubleshoot:/sbin/nologin
上例让第一段匹配00,~是匹配的意思。
awk还可以多次匹配,如下所示:
[root@localhost test]# awk -F ':' '/root/ {print$1,$3} /test/ {print $1,$3}' 1.txt
root 0
test 1006
operator 11
实例3、条件操作符:
awk语法结构:
awk -F ':' 'BEGIN{语句} {if(条件){语句1;语句2;语句3} }END{语句}'filename