第四章:三剑客之grep、sed

2019-11-13  本文已影响0人  chenkang

第一节:正则表达式

正则符号 含义
^ 开头
$ 结尾
. 任意一个字符
^$ 空行
* 匹配前面的字符出现0次或者0次以上
.* 所有
\ 取消特殊字符的含义
{n} 前面的字符匹配n次
{n,} 前面的字符至少匹配n次
{n,m} 前面的字符至少匹配n次,最多匹配m次,n<m
{,m} 前面的字符最多匹配m次

第二节:grep | egrep 过滤

1.grep相关option

option:
        -i      忽略大小写
        -v      排除 
        -n      显示过滤出来的内容所在文件的行号
        -c      统计过滤出来的总行数
        -w      精确匹配
        -o      只显示过滤出来的内容
        -E      支持扩展正则
        -r      递归过滤
        -R      递归过滤 
        -A      显示出过滤的出来的内容向下多少行
        -B      显示出过滤的出来的内容向上多少行
        -C      显示出过滤的出来的内容向上或向下多少行
        -q      安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0

2.相关参数的用法

1.不区分大小写过滤root  -i
[root@lb03 ~]# grep  -i  'root'  passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ROOT

2.过滤出含有root字符串的行数  -C
[root@lb03 ~]# grep  -ic  'root'  passwd 
4

3.过滤出含有root字符串的行,同时显示行号  -n
[root@lb03 ~]# grep  -in  'root'  passwd 
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
22:ROOT

4.过滤出除 /sbin/nologin 字符串的其他行(取反) -v
[root@lb03 ~]# grep -v  '/sbin/nologin'  passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
ROOT

5.精确过滤 -w
[root@lb03 ~]# grep  -iw  'root'  passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ROOT

6.只显示所过滤的字符串root -o
[root@lb03 ~]# grep  -o  'root'  passwd 
root
root

7.递归过滤  -r
[root@lb03 ~]# grep -r  'root'  ./*
./anaconda-ks.cfg:rootpw --iscrypted $6$uxSmIs.46F1YbJYk$W0p9dIjeZPPe556u5YJGhQvOQyEdTk2Q9pHELzfEvDFfUXbKSiyUB9RDAPsfpzSj9BoBXMoyYP87m2qv5xW56/
./anaconda-ks.cfg:pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
./data/oldboy.txt:root

8.过滤出adm字符串的后两行 -A
[root@lb03 ~]# grep -n -A 2 'adm'  passwd 
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6-sync:x:5:0:sync:/sbin:/bin/sync

9.过滤出adm字符串的前两行 -B
[root@lb03 ~]# grep -n -B 2 'adm'  passwd 
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin

10.过滤出adm字符串的前两行后两行 -C
[root@lb03 ~]# grep -n -C 2 'adm'  passwd 
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6-sync:x:5:0:sync:/sbin:/bin/sync       

3.grep结合正则表达式的用法

1.统计passwd文件中所有字母出现的次数
[root@lb03 ~]# grep -o  '[a-Z]'  passwd  |sort |uniq -c |sort -rn
     80 n
     77 o
     62 s
     55 i
     42 t
     38 b
 
2.统计passwd文件中所有单词出现的次数
[root@lb03 ~]# grep -Eo  '[a-Z]+'  passwd  |sort |uniq -c |sort -rn
     23 sbin
     21 x
     17 nologin
      6 var
      5 bin
      4 root
      3 sync
      3 spool
      3 shutdown

3.取ip地址
[root@lb03 ~]# ip a s eth0 |grep -w inet  | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' |head -1
10.0.0.4

4.取出文件中的身份证号码
[root@lb03 ~]# grep -Ew '[0-9]{17}[0-9X]'  id.txt
邹 371481199403259478
莫 52020319810613433X
荣 530124197504135438
阮 360702197902169951

第三节:sed流编辑器

1.sed的工作模式

2.sed的相关选项即参数

选项: 
        -n          取消默认输出
        -i          修改文件内容
        -r          支持扩展正则 
        -e          允许多项编辑
                
内部命令  
        a       追加
        i       插入
        s       替换
        g       全局
        p       打印
        d       删除
        i       忽略大小写
        c       原位置替换
        h               
        H 
        g 
        G 

3.sed用法

1.显示单行      
[root@lb03 ~]# sed -n  '1p'  passwd 

2.显示连续的多行
[root@lb03 ~]# sed -n  '1,3p'  passwd 

3.显示不连续的多行
[root@lb03 ~]# sed -n  '1p;3p'  passwd 
[root@lb03 ~]# sed -n '$p'  passwd
    
4.过滤字符串 
[root@lb03 ~]# sed  -n  '/root/p'  passwd 

5.过滤以root开头
[root@lb03 ~]# sed  -n  '/^root/p'  passwd 
[root@lb03 ~]# sed  -n  '/^ROOT/p'  passwd 

6.过滤以t为结尾的行
[root@lb03 ~]# sed  -n  '/t$/p'  passwd 
        
7.过滤出字符连续的行     
[root@lb03 ~]# sed  -n  '/adm/,/ftp/p'  passwd 

8.取出不同的字符串
[root@lb03 ~]# sed  -n  '/adm/p;/ftp/p'  passwd 
[root@lb03 ~]# sed -rn  '/adm|ftp/p'  passwd 

9.删除1行
[root@lb03 ~]# sed '1d'  passwd 

10.删除连续的多行
[root@lb03 ~]# sed '1,20d'  passwd 

11.删除整个文件
[root@lb03 ~]# sed '1,$d'  passwd 

12.删除不连续的多行
[root@lb03 ~]# sed '1d;3d'  passwd 

13.在某一行的后面追加内容 
[root@lb03 ~]# sed  '1aoldboy'  test.txt

14.在某一行的前面追加内容
[root@lb03 ~]# sed '1ioldboy'  test.txt

15.在文件的开头添加内容
[root@lb03 ~]# sed  '1s/^/oldboy\n/'  test.txt

16.在文件的结尾加入内容
[root@lb03 ~]# sed  '$s/$/\noldgirl/'  test.txt

4.sed的替换用法

1.全局替换
[root@lb03 ~]# sed  's#root#admin#g'  test.txt 

2.替换多行
[root@lb03 ~]# sed  '1,5s#bin#shell#g'  test.txt

3.只替换每一行第一个匹配的
[root@lb03 ~]# sed  '1,5s#bin#shell#'  test.txt

4.根据字符串匹配进行替换
[root@lb03 ~]# sed   '/^root/s#root#admin#g'  test.txt

5.忽略大小写替换
[root@lb03 ~]# sed   's#root#admin#gi'  test.txt

-c  原位置替换 (按行进行替换) 
6.匹配第一行进行替换
[root@lb03 ~]# sed  '1cadmin'  test.txt

7.包含匹配字符串的行全部替换
[root@lb03 ~]# sed  '/root/cadmin'  test.txt

[root@lb03 ~]# sed '7cSELINUX=enforcing'  /etc/sysconfig/selinux

[root@lb03 ~]# sed '/^SELINUX=/cSELINUX=enforcing'  /etc/sysconfig/selinux

[root@lb03 ~]# sed  '/^#Port/cPort 666'  /etc/ssh/sshd_config

[root@lb03 ~]# sed  '17cPort 666'  /etc/ssh/sshd_config

[root@web ~]# sed  '/^user/cuser www;'  /etc/nginx/nginx.conf

8.将文本中的换行符替换成空格
[root@lb01 ~/scripts/02]# cat url.txt 
www.baidu.com
www.taobao.com
www.mysun.com
[root@lb01 ~/scripts/02]# sed ':label;N;s/\n/ /;b label' url.txt
www.baidu.com www.taobao.com www.mysun.com

w   #将内容写到新的文件中
[root@lb03 ~]# sed  -n  '/root/w file.txt'  passwd 
[root@lb03 ~]# sed  -n  '1w file1.txt'  passwd 

e  #允许多项编辑 
[root@lb03 ~]# sed  '1,10d' passwd  |sed  's#root#123#g'
[root@lb03 ~]# sed  -e  '1,10d'  -e 's#root#123#g'  passwd 

n    #读入下一输入行,从下一条命令进行处理(对下一行进行n之后的处理)
[root@lb03 ~]# sed   '/root/{n;d}'  passwd 


[root@lb03 ~]# sed   '/root/{n; s/bin/123/}'  passwd

!    #非
[root@lb03 ~]# sed -n  '1!p'  passwd
[root@lb03 ~]# sed   '1!d'  passwd

#显示行号  
[root@lb03 ~]# sed  =  passwd

#对文件进行编辑的同时备份原文件(文件名以.bak结尾)
[root@lb03 ~]# sed -i.bak '1,$d' passwd

5.sed的高级用法

内部命令:
        h         #把模式空间里的内容重定向到暂存缓冲区
        H         #把模式空间里的内容追加到暂存缓冲区
        g         #取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容
        G         #取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容后面
        
用法:
1.将第一行的写入到暂存区, 替换最后一行的内容
[root@lb03 ~]# sed  '1h;$g'  file.txt

2.将第一行的写入到暂存区, 在最后一行调用暂存区的内容
[root@lb03 ~]# sed  '1h;$G'  file.txt

3.将第一行的内容删除但保留至暂存区, 在最后一行调用暂存区内容追加至于尾部
[root@lb03 ~]# sed  '1{H;d};$G'  file.txt

4.将第一行的内容写入至暂存区, 从第二行开始进行重定向替换
[root@lb03 ~]# sed  '1h;2,$g'  file.txt

5.将第一行重定向至暂存区, 2-3行追加至暂存区, 最后追加调用暂存区的内容
[root@lb03 ~]# sed '1h;2,3H;$G'  file.txt

6.sed给文件添加注释

1.为格式规范的文本添加注释
[root@lb03 ~]# sed  's#^#\##g'  file.txt

2.为格式杂乱的文本添加注释
原文本:
[root@lb03 ~]# cat file.txt
    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
sync:x:5:0:sync:/sbin:/bin/sync
    #    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

进行添加注释:
[root@lb03 ~]# sed  's/^[ \t#]*/#/g'  file.txt
#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
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt

3.把passwd文件中的第一列与第七列进行位置调换(后向引用)
[root@lb03 ~]# sed  -r  's#(.*)(:x.*:)(.*)#\3\2\1#g'  passwd
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
上一篇下一篇

猜你喜欢

热点阅读