Linux文本三剑客: grep sed awk
grep(查) ,按行处理
sed(行编辑器),按行处理
sed是一种流编辑器,每一次处理内容,只有确认,才会生效,如果不确认,只是把模式空间的临时数据展示给用户,然后删除
按照文本的行,一行一行向下处理,只到文件的最后一行
默认情况下,sed都是在模式空间执行,因此原文件不会发生变化,要变化怎么办??
sed -e "操作" 文件1 文件2
sed -e "操作1;操作2" 文件
-e:指定命令来处理输入的文本文件,只有一个操作,-e可以省略。多个指令才会用-e
-f:用特点的脚本文件来处理输入的文件
-i:立即生效
-n:仅显示script 处理后的结果
sed -i 立即生效 慎用
p:打印
=:只打印行号
打印:
sed自己还有一个默认输出,再加上打印,一共两行
取消默认输出
输出指定行的内容,只有第二行
只显示行号
显示行号和内容
打印最后一行
第一行到第三行
第一行和第二行
sed -n '1p;$p' test.txt
sed -n -e '1p' -e '$p' test.txt
第一行到最后一行的两种写法
n在p前面,跳过当前一行,打印下一行 偶数行
p在前面,则打印当前一行,跳下一行继续使用 奇数行
sed -n '/xx/p' test.txt
xx为需要过滤的内容
sed -n '/^root/p' /etc/passwd
用正则表达式过滤root开头的行
sed -n '/bash$/p' /etc/passwd
用正则表达式过滤bash结尾的行
sed -n '4,/bash$/p' /etc/passwd
第四行到第一个bash
sed使用扩展正则表达式,
sed -r 表示可以使用扩展正则。{n} {n,} {n,m} {,m}
1.包含两个99:的所在行
sed -nr '/(99:){2}/p' /etc/passwd
2.打印所有要么是以root开头,要么是以bash为结尾的行,打印
sed -nr '/^root|bash$/p' /etc/passwd
现在有一个文件,文件名我想保留,但是原有内容我要删除,免交互删
方法一
方法二
"d":操作符,删除的意思,对行操作
删除指定行
sed -n '3d;p' test.txt
删除第五行到最后一行
sed -n '5,$d;p' test.txt
除了一到四,其余删除(!取反)
sed -n '1,4!d;p' test.txt
一到六行删除(包括1和6)
sed '/one/,/six/d' test.txt
过滤空行
cat test.txt | sed '/^$/d'
我们用grep也可以实现
s:替换字符串
意思为替换第几个出现的root,然后替换
sed -n 's/root/test/gp' /etc/passwd 全量替换
思考题
1.以root开头处理,把开头为空的替换成# /etc/passwd
sed -n '/^root/ s/^/#/gp' /etc/passwd
2.对字母字符进行大小写替换
l&:转换为小写的特殊符号,在前面加上转义符才可以
把小写换成大写
u&:转换成大写的转移符号
u换成大写的U,然后加上g就可以全部换成大写
c:整行替换
sed '/one/c 22' test.txt
思考题:通过ifconfig修改ip:
cat ifcfg-ens33 | sed '/IPADDR/c IPADDR=1.1.1.1'
y:单字符替换,替换前后的字符长度要保持一致
sed 'y/on/12/' test.txt
将o替换成1,n替换成2
前后长度要保持一致,若后者数量多余前者,会报错
a:在匹配行的下一行添加内容
sed '/three/a zzr' test.txt
i:在匹配行的上一行添加内容
sed '/three/i 哈哈哈' test.txt
r:可以从其他文件读取内容,然后在匹配行的行后添加
可以直接在文本末行添加
sed '$a 123' test.txt
sed当中字符串分组询问
用脚本运行 -f
将空格替换为下划线
命令文件
处理对象为456.txt
思考题:过滤文件中的数字
当然。用grep一步就可以完成:
总结:
sed可以增,删,改,查
sed也可以结合正则表达式,但是sed的最主要作用就是改,增
使用sed命令时注意一点:大文件一定要分隔之后再交给sed处理
搭配扩展正则:sed -r {n} {n,m} {,m} 可以不需要加\
使用sed -i 立即生效,要注意事先做好测试,还要做好备份