1.1 sed
流式编辑器,主要擅长对文件的编辑操作,我们可以实现定制好编辑文件的指令,然后让sed自动完成对文件的整体编辑.
sed与vim的区别
(1)sed可以把处理文件的规则事先写好,然后用同一套规则编辑多个文件,vim只能手动一个一个编辑.
(2)sed处理文件,一次只能处理一行,即同一时间内存中只有文件的一行内容,无论文件内容多大,都不会对内存造成过大的压力,vim是一次把文件内容全部读取到内存再编辑,会占用过大的内存资源.
用法:
sed 选项 '规则' 文件路径
选项:
-n取消默认输出(只输出规则处理的结果,把默认输出的结果取消不输出)
-r支持扩展正则表达式
-i直接编辑文件(包括规则处理的结果和默认输出的结果)
规则:定位+命令
定位方式:
(1)行定位
1代表定位到第一行
1,3代表从第一行到第三行
1;3代表第一行和第三行
不写定位代表定位所有行
(2)正则表达式定位
/egon/包含egon的行
/^egon/以egon开头的行
/egon$/以egon结尾的行
(3)数字+正则表达式定位
'1,5p'代表打印1到5行
'1p;5p'代表打印第一行和第五行
'1,/egon/p'代表打印从第一行到首次匹配到egon的行
命令:
d 删除
p 打印
i 在指定行的上一行插入新的信息,如:
数字格式: '3ioldboy' 在第三行的上一行插入oldboy
字符格式: '/egon/ioldboy' 在egon所在行的上一行插入oldboy
a 在指定行的下一行附加新的信息,如:
数字格式: '3aoldboy' 在第三行的下一行附加oldboy
字符格式: '/egon/aoldboy' 在egon所在行的下一行附加oldboy
注意:如果一条命令需要在不同的行插入不同的信息,必须使用-e参数.例如sed -e '3aoldboy' -e '/a/aoldboy' filename
s###g 全局替换
s###gi 全局替换并且不区分大小写
命令可以用;号连接多条,如
1d;3d;5d代表删除1,3,5行.
'1p;2s#bin#xxx#gp'代表打印第一行,把第二行的bin替换成xxx并打印.
用法示例:
(1)p和d的用法
[root@localhost ~]# sed '' a.txt 定位所有行
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@localhost ~]# sed -n '' a.txt 定位所有行,并且取消默认输出
[root@localhost ~]#
[root@localhost ~]# sed -n '1,/xxx/p' a.txt 只打印1到xxx行,其他内容不输出到屏幕
egon1111
22222egon
3333egon33333
4444xxx44444
[root@localhost ~]# sed '1,/xxx/d' a.txt 删除1到xxx行
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@localhost ~]# sed '1d;3d;5d' a.txt 删除第一行,第三行,第五行
22222egon
4444xxx44444
6666egon6666egon666egon
(2)s///g 全局替换
[root@localhost ~]# sed 's/egon/BIGEGON/g' a.txt 把所有行的所有egon都替换BIGEGON
BIGEGON1111
22222BIGEGON
3333BIGEGON33333
4444xxx44444
5555xxx55555xxxx555xxx
6666BIGEGON6666BIGEGON666BIGEGON
[root@localhost ~]# sed '/^egon/s/egon/GAGAGA/g' a.txt 以egon开头的行中的egon换成GAGAGA
GAGAGA1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
[root@localhost ~]# sed '6s/egon/BIGEGON/' a.txt 只把第六行的egon换成BIGEGON,因为没加g,所以只替换第六行的第一个egon,不是全部替换.
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666BIGEGON6666egon666egon
[root@localhost ~]# sed '1,3s/egon/BIGEGON/g' a.txt 把1到3行的egon换成BIGEGON
BIGEGON1111
22222BIGEGON
3333BIGEGON33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
###加上-i选项,直接修改文件,通常会在调试完毕确保没有问题后再加-i选项
1.2 awk
awk主要用于处理有格式的文本,例如/etc/passwd
用法:
awk 选项 '规则' 文件路径
选项:
-F:指定分隔符
awk -F ": " 指定以:为分隔符
awk -F "[/:]" 指定以/ : 为分隔符
awk -F "[/:]+"指定以"/ : "为分隔符,并且如果"/ :" 之间没有字符,那么就把"/ :" 看做一个整体分隔符,如果"/" " : " 中间有字符,则要分开看做一列.
规则:定位+命令定位方式:
按数字
NR==2 取第二行
NR==2,NR==4或者NR>=2&&NR<=4 取第二行到第四行
NR==2||NR==4或者NR==2;NR==4 取第二行和第四行
按字符
'/egon/' 取字符egon所在行
'/egon/,/oldboy/' 取egon到oldboy所在行
'/egon/;/oldboy/'或者/egon/||/oldboy/ 取egon和oldboy所在行
按某一列来取行
'$2~/egon/' 找出第二列是egon的行
'$2~/egon/{print $1}' 找出第二列是egon行,并打印第一列信息
$2=="egon" 找出第二列是egon的行
命令:
print 输出打印
'{print $1}' 表示输出第一列内容
'{print $NF}' 表示输出倒数第一列内容
'{print $(NF-1)}' 表示输出倒数第二列内容
###总结: awk 命令中$符号的用法
$1 $2 $3: 表示取第几列
$NF: 取最后一列
$(NF-n): n是数字,表示取倒数第n+1列
$0: 表示取所有列
$NR:取第一列
取两列或者多列内容时,默认输出的信息是连在一起的,可以在'/a/{print $2,$3}' 中加个","号 输出的信息中间就会出现空格 也可以在'/a/{print $2":"3}'中加双引号,表示两列输出的内容中间会以 : 分隔
用法示例:
[root@localhost ~]# cat a.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
[root@localhost ~]# awk -F: '/^root/{print $1,$3}' a.txt 以root开头的行,并打印第一列和第三列
root 0
[root@localhost ~]# awk -F: '$1 ~ /^d/{print $1,$3}' a.txt 找到第一列以字符d开头的行,并打印第一列和第三列
daemon 2
[root@localhost ~]# awk -F: '$1 !~ /^d/{print $1,$3}' a.txt 取反
root 0
bin 1
adm 3
lp 4
[root@localhost ~]# awk -F: 'NR>3{print $1}' a.txt 找到大于第三行的内容,并打印第一列
adm
lp
[root@localhost ~]# awk -F: '$1 == "lp"{print $0}' a.txt 找到第一列是lp的字符,打印这一行所有内容
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
1.3 grep
过滤
用法: grep 选项 "过滤规则" 文件
选项:
-E :支持扩展的正则表达式。
-i :忽略大小写(ignore case)。
-v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
-n :显示行号
-c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
-o :只显示被模式匹配到的字符串。
-r : 可以过滤目录,递归过滤
-l : 文件中包含过滤的内容时,就会返回文件的路径信息,一般配合-r一起使用.例如:grep -rl 'egon' /etc/ 表示把/etc/下的所有包含"egon"信息的文件路径显示出来
[root@web01 ~]# ps aux |grep 'vim'
root 9825 0.0 0.5 151692 5212 pts/1 S+ 12:05 0:00 vim a.txt
root 10190 0.0 0.0 112724 988 pts/0 R+ 12:30 0:00 grep --color=auto vim
[root@web01 ~]# ps aux |grep '[v]im'
root 9825 0.0 0.5 151692 5212 pts/1 S+ 12:05 0:00 vim a.txt
[root@web01 ~]#
[root@web01 ~]# kill -9 9825