grep命令还不够强大,它只能用于查找,而不能进行替换。这里就需要用到sed以及awk命令了,他们能把替换的文本输出到屏幕上,而且还有其他丰富的功能。它们都是流式编辑器。是针对文本的行来进行操作的。
sed 格式为 sed -n '/n/'p filename
1.打印某行
sed -n 'n'p filename
$
尾
2,5 2至5行
5,$ 5至最尾行
sed -n '/root/'p mm.txt
sed也是支持. * 和+的 需要脱义前面加\的
如果不想脱义 前面加r
例如 sed -nr '/o+t/'p mm.txt
3.过滤字符串1或者字符串2(都匹配 会打印俩次 )
sed -nr '/root|var/'p mm.txt
-e 也是或者的意思 可多次使用
4.不区分大小写
sed -n '/n/'Ip mm.txt
5.删除某些行 (只删除打印 文件没修改)
sed '1,20’d mm.txt
删除所有字母 (其实就是个替换为空的过程)
6.-i 直接修改文件的内容
7.替换功能(会全部打印 )
sed ‘n1,n2s/x1/x2/g’ filename(n1,n2 不加 指全行)
正则表达式 不脱义前需加 -r
8.调换字符串的位置
格式为 sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'
//sed命令支持管道符,使用小括号把要替换的字符打包成一个整体。
.* 贪婪匹配 一直会匹配到最后
9.所有字符串前添加字符
sed -r 's/(.*)/aaa:&/' mm.txt
&表示括号内的整体
1.截取文档中的某段
打印头10行的第一段
head -10 mm.txt |awk -F ': ' '{print $1}'
//-F用来指定分隔符。不加-F选项,默认使用空格或者tab为分隔符,print为打印的意思。 $1表示打印第1字段 $0表示整行
2.可以打印多段’{print $1,$2,$4}’
可自定义分隔符 ‘{print $1’’#’’$2’’#’’$4}’ 自定义分隔符用双引号 引起
3.匹配字符或字符串
awk ‘/oo/’ mm.txt
awk -F ':' '$1 ~ /oo/'mm.txt
匹配 第一段oo字符的行打印出来
支持正则表达式 第一段一个或者一个以上的o的行
awk -F ‘:’ ‘$3==$4’ mm.txt 打印第三段和第四段相同的行
5.awk的内置变量
OFS 定义输出分隔符的
NR 表示行号
NF 表示用分隔符分隔后一共多少段
NR 作为判断条件
awk语法结构:
awk -F ‘:’ ‘BEGIN{语句} {if(条件){语句1;语句2;语句3} } END{语句}’ filename
打印某行到某行之间的内容
sed -n ‘/tss/,/sas/p’ /etc/passwd
sed转换大小写
sed在某一行最后添加一个数字
sed -r ‘s/(^a.)/\1 12/’ test
sed -r 's/^a./& 12/’ test
打印1到100行含某个字符串的行
sed -n ‘1,100{/abc/p}’ 1.txt
awk 中使用外部shell变量
a=2; echo “a?️c:d”|awk -F “:” -v get_a=$a ‘{print $get_a}’
awk 合并一个文件
awk ‘NR==FNR {a[$1]=$2} NR>FNR {print $0,a[$1]}’ 1.txt 2.txt
说明:
awk ‘{print NR,FNR}’ 1.txt 2.txt //首先理解NR和FNR的不同(awk支持同时操作多个文件内容)
当NR==FNR其实就是第一个文件的内容
当NR>FNR,其实就是第二个文件的内容
把一个文件多行连接成一行
方法一:
a=cat file
;echo $a
方法二:
awk ‘{printf("%s ",$0)}’ file
方法三:
cat file |xargs
awk中gsub函数的使用
awk ‘gsub(/www/,“abc”)’ /etc/passwd // passwd文件中把所有www替换为abc
awk -F ‘:’ ‘gsub(/www/,“abc”,$1) {print $0}’ /etc/passwd // 替换$1中的www为abc
awk 截取指定多个域为一行
用awk指定分隔符把文本分为若干段。如何把相同段的内容弄到一行?
以/etc/passwd为例,该文件以":"作为分隔符,分为了7段。
for i in seq 1 7
do
awk -F ‘:’ -v a=$i ‘{printf $a " "}’ /etc/passwd
echo
done
过滤两个或多个关键词
grep -E ‘123|abc’ filename // 找出文件(filename)中包含123或者包含abc的行
egrep ‘123|abc’ filename //用egrep同样可以实现
awk ‘/123|abc/’ filename // awk 的实现方式
awk用print打印单引号
awk ‘BEGIN{print "a’"’"‘s"}’
awk ‘BEGIN{print "a’’‘s"}’
awk ‘BEGIN{print “a"s”}’