一、文本处理三剑客命令初探
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 剃归