day04:三剑客之grep|sed

1、grep:

        在计算机科学中,是指用来描述和匹配一系列符合某个句法的规则的字符串,子啊很多文本编辑器或其他工具里,正则表达式用来检索和替换那些符合某个模式的文本内容,许多程序设计语言都支持利用正则表达式进行字符串操作:

2、元字符:正则表达式一般在工作用于查找文档或者查询某个日记文件,此时需要借助于元字符,元字符是指那些在正则表达式中具有特殊意义的专用字符,也使正则表达式具有处理能力:

元字符:

.   点,匹配任意单个字符,例如正则表达式"r.t" 匹配字符串,可以匹配rot rat r t,但是不能匹配root:

*  匹配零个或多个星号前面的字符,如“ .*  "表示匹配任意数量的任意字符(代表所有内容):

? 表示匹配0个或1个问号前面的字符:

+  表示匹配一个或多个加号前面的字符:

\  脱义字符,使元字符以普通的字符的身份出现,而不是通配符,如"\."只是表示而已:

[ ]  表示范围,匹配中括号里的字符,如正则表达式r[aeo]d,匹配rad  red  rod,也可指定区间[0-9a-z]

^    表示匹配行的开始:  ”^abc“      则表示只匹配以abc开头的行:

$    表示匹配行的结尾:   ”$abc“     表示只匹配以abc结尾的行:

^$  表示以开头为开头,以结尾为结尾:表示空行:

|    或者的意思,表示匹配多个条件:例如:  grep    "root\|bash"   passwd

word{n} :匹配指定数目的字符,例如:A[123]\{3\} 只能匹配三次,可匹配A123等,但不能匹配到A1234.

word{n,n} :匹配指定数目,还支持一个范围,A[123]\{4,6\}  表示匹配4到6次:

[root@localhost grep]# grep 'r.t'  passwd              #匹配.任意一个字符
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/

注意:以上只匹配出1个字符,而root也不会被匹配出来:

[root@localhost grep]# grep 'r\?t' passwd          #只匹配0个或1个字符:
root:x:0:0:root:/root:/bin/bash
rt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
注意:只匹配0个或1个字符,rrt不会被匹配出来。

[root@localhost grep]# grep 'r\+t' passwd         #匹配一个或多个加号前面的字符:
rt
rrt
注意:匹配一个多个字符,单独的r和t均不会被匹配出来:

[root@localhost grep]# grep 'o\{2\}' passwd          #表示 o 的重复次数两次:
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/noooologin
adm:x:3:4:adm:/var/adm:/sbin/noologin
[root@localhost grep]# grep '[oo]\{2\}' passwd       #还可以设置一个区间范围去循环:
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/noooologin
adm:x:3:4:adm:/var/adm:/sbin/noologin

注意:如上循环次数,3个o的不会被匹配出来:需要使用如下方法:

[root@localhost grep]# grep 'o\{1,4\}' passwd      #表示 o 重复1  2  3 次:
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/noooologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nooologin

grep的格式:分为egrep   fgrep

egrep   fgrep是grep的扩展:

grep  通过加  -E     -F   分别来使用egrep    fgrep等:

语法:grep   options   filename

options:

-c  : 只打印符号要求的行的行数量:   count-line

-n  :  打印出符合要求的行,并显示行号:   line-number

-i   :  过滤时对条件不区分大小写:

-v  :取反:

-r/R   :   遍历所有子目录:

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

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

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

-E :   使用egrep,     grep   -E  ===  egrep 

3、grep用法示例

[root@localhost grep]# grep -c 'root' passwd       #打印出符合root的行的行数量:
2 
[root@localhost grep]# grep -n 'root' passwd       #打印出符合要求的行,并显示行号:
1:root:x:0:0:root:/root:/bin/bash
16:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost grep]# grep -nv 'root' passwd      #取反,打印出除root之外的其他行:
7:sdfasdfr<osdafsfd
8:bin:x:1:1:bin:/bin:/sbin/NOTlogin
[root@localhost grep]# grep -i 'nol' passwd          #匹配大小写均可:
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/NOlogin

[root@localhost grep]# grep -r 'not' /etc/    #查找是not的目录的:前面紫色的表示路径:
/etc/dracut.conf:# Exact list of dracut modules to use.  Modules not listed here are not going
/etc/dracut.conf:# A list of fsck tools to install. If it's not specified, module's hardcoded

-A下   -B上    -C上下

[root@localhost grep]# grep -nA1 'root' passwd     #打印符合要求的行,并打印其上一行:
1:root:x:0:0:root:/root:/bin/bash
2-rt
[root@localhost grep]# grep -nB1 'root' passwd     #打印符合要求的行,并打印其上一行:
11-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
12:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost grep]# grep -nC1 'root' passwd     #打印符合要求的行,并打印其上下各一行:
11-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
12:operator:x:11:0:operator:/root:/sbin/nologin
13-games:x:12:100:games:/usr/games:/sbin/nologin
[root@localhost grep]# grep -n "root\|bash" passwd       #打印出root或者bash的行:
1:root:x:0:0:root:/root:/bin/bash
12:operator:x:11:0:operator:/root:/sbin/nologin
27:yuanhh:x:1000:1000::/home/yuanhh:/bin/bash

3.2、中括号:[  ]     [0-9]   [a-z]   [A-Z]    [a-zA-Z]   [0-9a-z]    [0-9a-zA-Z] 

[root@localhost grep]# grep [0-9] inittab       #过滤出inittab文件里包含数字的行:
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
111111111

如上图,过滤出了文件里包含数字的行:

此时我们需要引入一个概念:如下:

^word          表示以什么开头:

[^  ]             表示否定:过滤出非什么的行:  [0-9]  非数字所在的其它行:   

^[^  ]          表示过滤出以非什么开头的行:   ^[^0-9]   过滤出非数字开头的行:不是数字开头的:

[root@localhost grep]# grep '^#' inittab         #过滤出以#号开头的行:
# To set a default target, run:
# systemctl set-default TARGET.target
[root@localhost grep]# grep '[^0-9]' inittab     #过滤出非数字所在的行:数字在中间也不行:
# To set a default target, run:
# systemctl set-default TARGET.target
[root@localhost grep]# grep '^[^0-9]' inittab    #表示过滤出非数字开头的行:只有以数字开头的才会被过滤:
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
[root@localhost grep]# grep -v '^[^0-9]' inittab   #取反的意思,表示显示数字开头的行:
111111111

 有如下:

[^0-9] 非数字,(包括大小写字符和特殊符号)

[^a-zA-Z] 非字母(包括数字和特殊符号)

[0-9a-zA-Z] 非数字字符(包括特殊符号)

egrep:   如果要是使用egrep时:则不需要脱义:    +   ?   |     { }

[root@localhost grep]# egrep 'r?t' passwd
[root@localhost grep]# egrep 'r+t' passwd
[root@localhost grep]# egrep 'o{2}' passwd
[root@localhost grep]# egrep 'root|bash' passwd
 

扩展:

过滤一个目录下所有某类型文档中含有某字符的行:

​[root@localhost grep]# grep -r --include "*.txt" 'root' /root/  
root/1.txt:#KillExcludeUsers=root
/root/1.txt:log_group = root
/root/1.txt:action_mail_acct = root

过滤出/root/目录下所有.txt的文件中含有字符串root的行:
​

过滤出/root/目录下所有.txt的文件中含有字符串root的行:

 

 

sed命令:sed是一种流编辑器,它是文本处理非常重要的工具,它和grep一样,也支持grep的所有功能,比如过滤和查找,sed最主要的功能是替换:方便快捷:

           处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

sed语法:sed   options   commond   filename           #使用语法

options:

-n:只显示当前符合要求的行:(sed默认会显示所有行,并且重复打印两行无颜色显示):

-p:查找,查找时需要加此选项了:

-d:删除,删除并输出在屏幕,不会修改源文件内容:

-i:加此选项会自己修改源文件内容,需要结合替换和删除时使用:

-e:可以过滤多个选项,加上此选项后,支持多个过滤条件:

-r:加上此选项后若表达式中有特殊字符则不需要使用脱义字符:

's###g'  =  's@@@g'   =     's///g':表示替换字符:可用#=@=/都可以的:

2、案例:

[root@localhost sed]# sed '/root/'p test.txt|head -8     #过滤出包含'root'行,并打印两次:还会打印所有行:
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
rt
rrt
BUSSDFLSKFLkjlsfsfs
Bin:x:1:1:bin:/bin:/sbin/NOLogin
daemon:x:2:2:daemon:/sbin:/sbin/noooologin
adm:x:3:4:adm:/var/adm:/sbin/noologin
[root@localhost sed]# sed -n '/root/'p test.txt        #只打印出符合要求的行:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

3、同时也支持“ . ”  " * "   " + "    " ? "      这些特殊字符:

[root@localhost sed]# sed -n '/o.t/'p test.txt      #过滤一个字符:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@localhost sed]# sed -n '/o*t/'p test.txt      #过滤零个或多个前面的字符:
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

如果需要使用"  +  "   " ? "  “  |   ”特殊字符,需要加脱义选项或者“ -r ”选项:

[root@localhost sed]# sed -n '/o+t/'p test.txt   #什么也不显示,需要加脱义才可以:
[root@localhost sed]# sed -n '/o\+t/'p test.txt       #过滤出一个或多个字符:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]# sed -n '/o\?t/'p test.txt       #过滤出零个多一个字符:
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost sed]# sed -nr '/o+t/'p test.txt      #或者加-r选项也可以的:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]# sed -nr "/root|bash/"p test.txt    #或者,过滤出root或者bash的:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
yuanhh:x:1000:1000::/home/yuanhh:/bin/bash

4、忽略大小写:  I

[root@localhost sed]# sed -n '/root/'Ip test.txt    #过滤出test.txt的文件中的root,不区分大小写:
root:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

5、打印行:  打印指定行:

[root@localhost sed]# sed  -n '2'p test.txt       #只打印第二行:‘2’p
ROOT:x:0:0:root:/root:/bin/bash
[root@localhost sed]# sed  -n '2,5'p test.txt     #只打印第二行到第五行:‘2,5’p
ROOT:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
BUSSDFLSKFLkjlsfsfs
Bin:x:1:1:bin:/bin:/sbin/NOLogin
[root@localhost sed]# sed  -n '25,$'p test.txt     #打印25号到末行:‘25,$’p
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/NOlogin
yuanhh:x:1000:1000::/home/yuanhh:/bin/bash
[root@localhost sed]# sed  -n '/^1/'p test.txt     #只打印以数字1开头的行:   ‘/^1/’p
11111111
[root@localhost sed]# sed  -n '/1$/'p test.txt     #只打印以数字1结尾的行:    ‘1$/’p
11111111

6、在同一个行内执行多个命令:   -e

[root@localhost sed]# sed -ne '1'p -e '/bus/'p test.txt     #打印出第一行和包含bus的行:
root:x:0:0:root:/root:/bin/bash
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@localhost sed]# sed -ne '1'p -e '/root/'p test.txt     #打印第一行和包含root的行:
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash

解读:sed -ne '1'p -e '/root/'p test.txt该命令的意思是:打印第一行,同时打印出匹配root的行,当打印的内容和匹配的内容相同时,会分别显示,即:两个命令同时进行但相对独立:

7、删除指定行:-d

[root@localhost sed]# cat -n test.txt|sed '1,25'd    #删除其1到25行:
    26  yuanhh:x:1000:1000::/home/yuanhh:/bin/bash

注:这种方法不会删除文件内容,只会删除了输出在屏幕上的指定行,如果想修改文件内容呢,那需要怎么做呢:

8、修改文件内容: -i   结合替换和删除使用:

[root@localhost sed]# wc -l test1             #查看当前的行:
26 test1
[root@localhost sed]# sed -i '1,24'd test1    #删除其1到25行:
[root@localhost sed]# wc -l test1             #再次查看还有2行:
2 test1

9、sed的替换功能:

test文档里面的root替换为toor:

[root@localhost sed]# sed '1,10s/root/toor/g' test.txt   #把文档里面的root替换为toor:
toor:x:0:0:toor:/toor:/bin/bash
11111111
BUSSDFLSKFLkjlsfsfs
Bin:x:1:1:bin:/bin:/sbin/NOLogin


[root@localhost sed]# sed -r '1,10s/ro+/r/g' test.txt  #如在文档里使用特殊符号,则需要用-r或者‘/’来脱义:
rt:x:0:0:rt:/rt:/bin/bash
11111111
BUSSDFLSKFLkjlsfsfs
Bin:x:1:1:bin:/bin:/sbin/NOLogin
daemon:x:2:2:daemon:/sbin:/sbin/noooologin

#注意:如在文档里使用特殊符号,则需要用-r者‘/’来脱义:

把test文档里面第一段最后一段调换位置:

[root@localhost sed]# head test.txt|sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1:/g'
/bin/bash:x:0:0:root:/root:root:
11111111
BUSSDFLSKFLkjlsfsfs
/sbin/NOLogin:x:1:1:bin:/bin:Bin:
/sbin/noooologin:x:2:2:daemon:/sbin:daemon:
/sbin/noologin:x:3:4:adm:/var/adm:adm:
/sbin/nooologin:x:4:7:lp:/var/spool/lpd:lp:

[root@localhost sed]# head test.txt|sed -r 's#([^:]+):(.*):([^:]+)#\3:\2:\1#g'
/bin/bash:x:0:0:root:/root:root
11111111
BUSSDFLSKFLkjlsfsfs
/sbin/NOLogin:x:1:1:bin:/bin:Bin
/sbin/noooologin:x:2:2:daemon:/sbin:daemon
/sbin/noologin:x:3:4:adm:/var/adm:adm

如上:如上两种方法均可以的

也可以只把root替换为123:如下:

[root@localhost sed]# head test.txt|sed 's#/root#123#g'      #把test.txt文档中的root替换为123:
root:x:0:0:root:123:/bin/bash
11111111
BUSSDFLSKFLkjlsfsfs
Bin:x:1:1:bin:/bin:/sbin/NOLogin
daemon:x:2:2:daemon:/sbin:/sbin/noooologin
adm:x:3:4:adm:/var/adm:/sbin/noologin
[root@localhost sed]# head test.txt|sed 's/\/root/123/g'     #把root替换123:不过root需要脱义:
root:x:0:0:root:123:/bin/bash
11111111
BUSSDFLSKFLkjlsfsfs
Bin:x:1:1:bin:/bin:/sbin/NOLogin
daemon:x:2:2:daemon:/sbin:/sbin/noooologin

删除内容:替换为空 即可:

[root@localhost sed]# head -10 test.txt|sed 's#[0-9a-zA-Z]##g'   #把前10行替换为空:
:::::/://
:::::/://
:::::/://
::::://://
:::::///://

附加:在所有行的前面加字母:

[root@localhost sed]# head -10 test.txt|sed -r 's#^#aaa:#'             #第一种方式:
aaa:root:x:0:0:root:/root:/bin/bash
aaa:adm:x:3:4:adm:/var/adm:/sbin/noologin
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nooologin
aaa:sync:x:5:0:sync:/sbin:/bin/sync
aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
aaa:halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost sed]# head -10 test.txt|sed -r 's#(.*)#aaa:\1#g'      #第二种方式:
aaa:root:x:0:0:root:/root:/bin/bash
aaa:adm:x:3:4:adm:/var/adm:/sbin/noologin
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nooologin
aaa:sync:x:5:0:sync:/sbin:/bin/sync
aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
aaa:halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost sed]# head -10 test.txt|sed -r 's#(.*)#aaa:&#g'      #第三种方式:
aaa:root:x:0:0:root:/root:/bin/bash
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nooologin
aaa:sync:x:5:0:sync:/sbin:/bin/sync
aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
aaa:halt:x:7:0:halt:/sbin:/sbin/halt

说明:如上图:     &符号===\1         均代表前括号里面的字符

sed转换大小写字母

1、首字母小写变大写:

[root@localhost sed]# head -10 test.txt|sed  's#\b[a-z]#\U&#g'    #首字母小写变大写:
Root:X:0:0:Root:/Root:/Bin/Bash
Lp:X:4:7:Lp:/Var/Spool/Lpd:/Sbin/Nooologin
Sync:X:5:0:Sync:/Sbin:/Bin/Sync
Shutdown:X:6:0:Shutdown:/Sbin:/Sbin/Shutdown
Halt:X:7:0:Halt:/Sbin:/Sbin/Halt

2、文档全部内容小写变大写:

[root@localhost sed]# head -10 test.txt|sed 's#[a-z]#\U&#g'    #文档全部内容小写变大写:
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOOOLOGIN
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、文档全部大写变小写:

[root@localhost sed]# sed -i 's#[a-z]#\U&#g' test.txt     #首先把文档内容全部小写变成大写:
[root@localhost sed]# head -10 test.txt|sed 's#[A-Z]#\l&#g'   #然后再把内容大写变成小写:
root:x:0:0:root:/root:/bin/bash
11111111
bussdflskflkjlsfsfs
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/noooologin
adm:x:3:4:adm:/var/adm:/sbin/noologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nooologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

转载于:https://my.oschina.net/yuanhaohao/blog/2991218

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值