第九章、正则

9.1 正则介绍_grep上

9.2 grep中

9.3 grep下

9.4/9.5 sed

9.6/9.7 awk

9.8扩展

 

9.1 正则介绍_grep上

grep  [-cinvABC] 'word' filename

 

-c 行数

[root@xinlinux-02 ~]# grep -c "login" /etc/passwd

17

 

-i  不区分大小写

[root@xinlinux-02 ~]# grep -n "a" 1.txt

1:aaaaaaaaaa

3:aaaaaaaaaa

[root@xinlinux-02 ~]# grep -ni "a" 1.txt

1:aaaaaaaaaa

2:AAAAAAAAAAAAAA

3:aaaaaaaaaa

4:AAAAAAAAAA

 

-n 显示行号

[root@xinlinux-02 ~]# grep -n "a" 1.txt

1:aaaaaaaaaa

3:aaaaaaaaaa

 

-v  取反

[root@xinlinux-02 ~]# grep -v "a" 1.txt

AAAAAAAAAAAAAA

AAAAAAAAAA

 

-A 后面跟数字,过滤出符合要求的行以及下面n行

[root@xinlinux-02 ~]# cat 1.txt

AAA

aaaa

123

465

145

[root@xinlinux-02 ~]# grep -A2 "123" 1.txt

123

465

145

 

ifconfig  |grep  -A 1 "ens33" | tail -1 |awk -F  ' '   '{print $2}'                       #方便拿网卡ip地址

[root@xinlinux-02 ~]# ifconfig  |grep  -A 1 "ens33" | tail -1 |awk -F  ' '   '{print $2}'

192.168.233.130

 

-B 后面跟数字,过滤出符合要求的行以及上面n行

[root@xinlinux-02 ~]# grep -B2 "123" 1.txt

AAA

aaaa

123

 

-C 后面跟数字,过滤出符合要求的行以及上下各n行

[root@xinlinux-02 ~]# grep -C2 "123" 1.txt

AAA

aaaa

123

465

145

 

-r   目录     遍历该目录下所有子目录

[root@xinlinux-02 ~]# grep "passwd" /etc/

grep: /etc/: 是一个目录

[root@xinlinux-02 ~]# grep -r  "passwd" /etc/

/etc/login.defs:# passwd command) should therefore be configured elsewhere. Refer to

/etc/default/nss:#  If set to TRUE, the passwd routines in the NIS NSS module will not

/etc/default/nss:#  use the passwd.adjunct.byname tables to fill in the password data

 

 

9.2 grep中

###^在外面表示以什么开头,在方括号里面表示反义、非意

grep -n 'root' /etc/passwd    

 #/etc/passwd 找含有root的行并显示行号

 

grep -nv 'nologin' /etc/passwd

 #取反,/etc/passwd 找含有不包含nologin的行并显示行号

 

grep '[0-9]' /etc/inittab        

 #/etc/inittab里面过滤出带数字的行

 

grep -v '[0-9]' /etc/inittab   

 #/etc/inittab里面过滤出不包含数字的行

 

grep -v '^#' /etc/inittab

#/etc/sos.conf里面过滤出不含注释符#的行

 

grep -v '^#' /etc/inittab |grep -v '^$'  ==   grep -v '^#

 | ^$' /etc/inittab

#/etc/inittab内过滤出非注释行和非空行

 

grep '^[^a-zA-Z]' test.txt

#过滤出以非字母开头的行

 

 

9.3 grep下

egrep为grep的增强版,可以识别特殊字符,不需要用脱义符"\"

 

“ . ”与“  ? ”的区别

1、" . "表示任意一个字符,和前面的字符没有任何关系 (不能为0个字符),例:grep " r..t"  /etc/passwd

2、"?"表示前面的字符为0或1个   例:ro?t    可以表示rot   rt

 

" * "星号表示任意字符,以星号前面一个字符为标准,出现0-n次

 

" .* "表示零个或者多个字符,空行也包含在内

 

grep 'r.o'  test.txt

#" . "点表示任意一个字符,过滤出text.txt内含有r( )0的行;()表示任意一个字符

 

grep 'o*o'  test.txt

# " * "代表(可为0)任意个*号前面的那个字符  

 

grep  '.*'  test.txt

# " .* "表示匹配任意所有字符,包括空行

 

grep 'o\{2\}' /etc/passwd  ==  egrep 'o{2}'  /etc/passwd   ==   grep  -E 'o{2}'  /etc/passwd

# " { } "花括号表示范围,过滤/etc/passwd内包含2个o的行

 

egrep 'o+' /etc/passwd

# " + "加号表示+号前字符出现1次或以上,过滤/etc/passwd内出现一次o以上的行

 

egrep 'oo?' /etc/passwd

# " ? "表示问号前一个字符出现0次或者1次,过滤/etc/passwd内含有oo、o的行

 

egrep ''root | nonlogin' /etc/passwd

#过滤出/etc/passwd内含有root或者nonogin的行

 

egrep '(oo){2}' /etc/passwd

#过滤/etc/passwd内出现2次oo的行

 

 

9.4/9.5 sed

#sed能实现grep的功能,但是麻烦,也不会显示颜色;所以sed主要用于替换

#sed也支持正则表达式,包括特殊字符

查找字符串

sed  -n  '/root/ 'p   1.txt    

# ' ' 单引号里面如果是字符串的话需要加上双斜杠//   

 

指定行

sed -n  '2'p    1.txt        #打印出1.txt的第二行

#' ' 单引号里面如果是数字的话,表示打印指定行,不需要加双斜杠

 

指定范围行

sed -n  ' 2,6'p   1.txt     #打印出1.txt的第二行到第六行

sed -n  ' 2,$'p   1.txt     #打印出1.txt的第二行到行尾

sed -n  ' 1,$'p   1.txt     #打印出1.txt的全文

 

-e表示在一条命令执行多个操作,相互不会影响

sed -e '1'p   -e'/111/'p  -n  1.txt   

#打印1.txt第一行的同时打印含有字符串111的行

ps:如果多个命令间查找的结果相同,会重复打印出来

 

sed查找打印不区分大小写

#在p前面加一个大写的i,

sed  -n  '/root/ 'Ip   1.txt   

#打印1.txt内不区分大小写的root字符串的行   

 

sed删除并打印删除后的内容d(d只是删除屏幕不显示)

sed  '1, 10'd 1.txt     #删除1.txt内第1到10行的内容后打印出来

sed  '/root/'d 1.txt    #删除所含root字符串所在行后打印出来

 

sed -r    #使特殊字符生效,不用使用转义字符

sed -n  '/r*\+t/'p  /etc/passwd

相当于

sed -nr  '/r*+t/'p  /etc/passwd

 

加-i ,表示直接替换文本  (-i删除是修改文件内容)

sed -i  "1,$s/root/xin/g" /etc/passwd 

#将全文的root替换成xin

 

sed   -i   '1, 10'd 1.txt    #删除文档1.txt第一到十行的文本内容

 

sed替换(与vim的替换相似)

sed '1,10s/root/toor/g'   1.txt     

#将1.txt第一到十行内全局替换,root换成toor

 

 

1、替换内容时,有/,需要用\

head passwd |sed 's/\/sbin\/nologin/123/g'

2、或者使用@、#等替换分隔符

head passwd |sed 's@/sbin/nologin@123@g'

 

sed 's/[a-zA-Z]//g    #把英文字母全部删除,相当于替换为空

 

将第一段和最后一段调换位置

sed -r ‘s/([^:]+):(.*):([^:]+)/\3:\2:\1/’

([^:]+)    非冒号,一个或多个 1

:(.*):          贪婪匹配,一直匹配到最后一个冒号 2

([^:]+)    非冒号,一个或多个 3

#前面用小括号()括起来的,后面要用反斜杠\数字去表示

\3:\2:\1     将1,2,3分别代表([^:]+) 、:(.*): 、([^:]+),即\1:\2:\3,调换顺序就是调换位置

 

sed -r   #插入字符   (常用)

 

sed -r ‘s/(.*)/aaa:&/’     #在所有行行首加上aaa

sed -r ‘s/(.*)/&:aaa/’      #在所有行行尾加上aaa

sed -r ‘1s/(.*)/aaa:&/’     #在行首加入aaa

sed -r ‘1,5s/(.*)/aaa:&/    在第1到5行加入aaa

#s前写入数字或者范围就是具体数加的位置

sed -r 's/(.*)/#&/'  1.txt             给1.txt所有行首加一个#

 

sed追加(行后):a\命令

 

将this is a test line  追加到以test开头的行后面

sed '/^test/a\this is a test line ' file

 

在 1.txt文件第二行之后插入this is a test line :

sed  -i  '2a\this is a test line'   1.txt

 

sed插入(行前):i\命令

 

将this is a test line  追加到以test开头的行前面

sed '/^test/i\this is a test line ' file

 

在 1.txt文件第五行之前插入this is a test line :

sed  -i  '5i\this is a test line'   1.txt

 

 

9.6/9.7 awk

#支持分段,可以针对段做匹配,支持正则表达式(也支持特殊符号,不需要加脱义字符"/")

 

#若是不-F指定分隔符,会默认空格或者空字符为分隔符

1、

awk -F  ':'  '{print $1}'    1.txt

#选取1.txt通过awk用":"冒号分段,取$1第一段内容

 

awk -F  ':'  '{print $1,$3,$4}'  1.txt

#取$1、$3、$4第一段、第三段、第四段内容

 

awk -F  ':'  '{print $0}'   1.txt

#$0取所有段的内容

 

awk -F ':' '{print $1"#"$2"#"$3"#"$4}'

#手动添加分隔符

 

2、awk匹配功能

awk '/oo/' 1.txt

#将含有oo字符串的匹配出来

 

awk -F ':'  '$1~/oo/'1.txt

#将第一段含有oo字符串的匹配出来

 

3、awk支持多个表达式一起写

awk -F ':'  '/root/ {print $1,$3}  /user/ {print $3,$4}' 1.txt

#将含有root的行打印第一段和第三段内容,同时将含有user的行打印第三段和第四段内容

 

4、awk数学运算表达式

awk -F ':' '$3==1000'  /etc/passwd

#匹配第三段等于1000的行

 

awk -F ':' '$3==''1000''' /etc/passwd

#匹配第三段等于通过ascii配对1000获得值的行

#针对数字的不要加双引号,加了双引号系统会通过ASCII码进行匹配

 

awk -F ':' '$3==1000   {print $1}'   /etc/passwd

#匹配第三段等于1000的行列出第一段

 

awk -F ':' '$7!="/sbin/nologin"' /etc/passwd

#" != "表示不等于;  匹配第七行不等于/sbin/nologin的行

 

5、awk字段间比较

awk -F ':' '$3>$4' /wtc/passwd

#匹配第三段大于第四段的行

 

awk -F ':' '$3==$4' /wtc/passwd

#匹配第三段等于第四段的行

 

awk -F ':' '$3>"5" && $3<"7"' /etc/passwd

#匹配第三段大于5且小于7的行

 

awk -F ':'  '$3>1000 || $7=="/bin/bash"'  /etc/passwd

#匹配第三段大于1000或者第七段等于/bin/bash的行

 

6、OFS内置变量

awk -F ':' '{OFS="#"}   匹配条件     {print $1,$3,$4}'   /etc/passwd

#将匹配到的第一、三、四段的内容用"#"号分隔符分隔

#{OFS="#"},OFS:内置变量,表示指定print时用到的分隔符

#两个花括号之间写匹配的条件

 

awk -F ':'   '{OFS="#"}   {if ($3>1000)  {print $1,$3,$4}}'  /etc/passwd

#匹配第三段内容大于1000的行,将第一、第三、第四段输出并用"#"号隔开

 

7、内置变量NF(段数)、NR(行号)

$NF    #最后一段的内容

$NR   #第几行的第几列,比如第一行第一列,第二行第二列

$0      #表示整行

 

awk -F ':' '{print NF}'

#将段数显示出来

 

awk -F ':' '{print NF":"$0}'  /etc/passwd

#将所有段的段数显示出来

 

awk -F ':' '{print NR}'

#将行号显示出来

 

awk -F ':' '{print NR":"$0}'  /etc/passwd

#将所有段的行号显示出来

 

awk 'NR>40' /etc/passwd

#把从第41行开始的行显示出来

 

awk -F ':'  'NR<20 && $1~/roo/'  /etc/passwd

#把行号小于20行且第一段为roo的匹配出来

 

awk -F ':' '{print $NR":"$NF}'  /etc/passwd

#passwd一共只有7段, 所以$NF=$7;$NR则是从$1开始一直下去

 

8、赋值"="号,赋值后分隔符会消失

head -n3 /etc/passwd |awk -F ':' '$1="root" '

#将passwd的第一段内容赋值为root

head -n3 /etc/passwd |awk -F ':'  {OFS=":"}  '$1="root" '

#将赋值后的内容定义分隔符为":"冒号

 

awk -F ':'  '{if ($1="root") {print $0}}'  /etc/passwd

#将passwd的第一段内容赋值为root,然后输出所有段

 

9、"=="等于号

head -n3 /etc/passwd |awk -F ':' '$1=="root" '

#匹配第一段为root的内容

 

10、求和第三段所有列的和     (tot表示求和,默认从0开始)

awk -F ':' '{(tot=tot+$3)}; END {print tot}'  /etc/passwd

#{(tot=tot+$3)}tot值表示每次循环都会把第三段的值相加,即第一行的第三段加第二行的第三段,一直循环加下去,就是求和第三段所有列的和

 

11、以指定分隔符分隔的两种方法

1、在print内段间插入"分隔符"

awk  -F ':'{print $1"#"$2"#"$3"#"$4"#"$5} 1.txt    #以#做分隔符

 

2、通过内置变量OFS

awk -F ':' '{OFS="#"} {print $1,$2,$3,$4,$5}  1.txt    #以#做分隔符

加上双引号”“之后,相当于sort不加-n。就代表1000不再是数字,而是一个字符串,是以ASSIC码计算的。

 

9.8扩展

把一个目录下,过滤所有*.php文档中含有eval的行

grep -r --include="*.php" 'eval' /data/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值