文本命令之三剑客初探

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



原文地址:https://www.cnblogs.com/allenzhu128/p/13864489.html