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