文本处理三剑客

一、文本处理三剑客命令初探

1.1 sed(老三)

流式编辑器,主要擅长对文件的编辑操作,我们可以事先定制好编辑文件的指令,然后让sed自动完成 对文件的整体编辑
#用法
sed选项’定位+命令’文件路径
#选项
-n取消默认输出
-r支持扩展正则元字符(由于尚未学习正则,所以此处暂作了解)
-i立即编辑文件
#命令
d              选行
p              打印
s///g          替换
命令可以用;号连接多多条,如1 d;3d;5d代表删除1, 3, 5行
# =====================: 》用法示例:p与d 
命令# sed egon1111 '' a.txt
22222egon 
3333egon33333 
4444xxx44444
5555xxx55555xxxx555xxx 
6666egon6666egon666egon
命令# sed -n '' a.txt 
命令# sed -n '1,/xxx/p' a.txt
egon1111
22222egon 
3333egon33333 
4444xxx44444 
命令# sed '1,/xxx/d' a.txt
5555xxx55555xxxx555xxx 
6666egon6666egon666egon 
命令# sed '1d;3d;5d' a.txt
22222egon
4444xxx44444
6666egon6666egon666egon

# =====================: 》用法示例:s///g
命令# cat a.txt
egon1111
22222egon 
3333egon33333 
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
命令# sed 's/egon/BIGEGON/g' a.txt
BIGEGON
BIGEGON1111
22222BIGEGON
3333BIGEGON33333
4444xxx44444
5555xxx55555xxxx555xxx
6666BIGEGON6666BIGEGON666BIGEGON
命令# sed '/"egon/s/egon/GAGAGA/g' a.txt#以egon开头的行中的egon换成 GAGAGA
GAGAGA111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
命令# sed '6s/egon/BIGEGON/' a.txt BIGEGON,加上g代表只把第6行的egon换成BIGEGON,加上g代表???
egon1111
22222egon
3333egon33333
4444xxx44444
5555xxx55555xxxx555xxx
6666BIGEGON6666egon666egon
命令# sed '1,3s/egon/BIGEGON/g' a.txt # 把 1 至“3 行的 egon 换成BIGEGON
BIGEGON
BIGEGON1111
22222BIGEGON
3333BIGEGON33333
4444xxx44444
5555xxx55555xxxx555xxx
6666egon6666egon666egon
命令# cat a.txt | sed '1,5d' #sed也支持管道
6666egon6666egon666egon
#加上-i选项,输出结果直接覆盖内容文件,通常会在调试完毕确保没有问题再加-i选项
#定位
行定位:
      1定位到第一行
      1,3代表从第1行到第3行
      不写定位代表定位所有行
正则表达式定位:
             /egon/包含egon的行
             /"egon/以egon开头的行
             /egon$/以egon结尾的行
数字+正则表达式定位:
                "1,8p"代表打印1到8行,
                "1,/egon/p"则代表取从第1行到首次匹配到/egon/的行

1.2 awk(老大)

awk主要用于处理有格式的文本,例如/etc/passwd这种
#用法
awk 选项'pattern{action}'文件路径 
#选项
-F指定行分隔符
#工作流程
awk -F: '{print $1,$3}' /etc/passwd

1、awk会读取文件的一行内容然后赋值给$0
2、然后awk会以-F指定的分隔符将该行切分成n段,最多可以达到100段,第一段给$1,第二段给$2,依次次类推
3、print输出该行的第一段和第三段,逗号代表输出分隔符,默认与-F保持一致
4、重复步骤1,2,3直到文件内容读完

#内置变量
$0 一整行内容
NR记录号,等同于行号
NF以-F分隔符分隔的段数 

# pattern可以是
/正则/
/正则/                     #该行内容匹配成功正则
$1 ~ /正则/                #第一段内容匹配成功正则
$1 !~ /正则/               #第一段内容没有匹配成功正则 
比较运算:
         NR >= 3 && NR <=5	                         # 3到 5行
         $1 == "root"                                    #第一段内容等于root               

 # action可以是 
               print $1,$3
# 用法示例
命令# cat a.txt
 root:x:0:0:root:/root:/bin/bash
 bin:x:l:l: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
命令# awk -F: '/^ root/{print sl,s3}' a.txt 
root 0
命令# awk -F: 'sl - /^d/ {print sl,s3}' a.txt
daemon 2
命令# awk -F:  'sl !~ /^d/{print sl,s3}' a.txt 
root 0
bin l
adm 3
lp 4
命令# awk -F: 'NR>3{print sl}'  a.txt 
adm
lp
命令# awk -F: ! sl ==  "lp"{print s0}'  a.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
命令# cat a.txt | awk -F: '{print sl}' # awk也支持管道
root
bin 
daemon
adm 
lp
事实上awk是一门编程语言, 可以独立完成很强大的操作.

1.3grep(老二)

grep擅长过滤内容

#用法
grep选项’正则’文件路径

# 选项
-n, --line-number                  在过滤出的每一行前面加上它在文件中的相对行号
-i, --ignore-case                  忽略大小写
--color                            颜色
-l, -- files-with-matches          如果匹配成功, 则只将文件名打印出来, 失败则不打印
                                   通常-rl一起用, grep -rl ! root! /etc
-R, -r, --recursive                剃归


原文地址:https://www.cnblogs.com/qiukangle/p/13954066.html