Linux生产环境上,最常用的一套“Sed“技巧
“Sed” 高级功能:我这小脑瓜都快绕晕了
基础 basic
- 搜索并打印关键词的行
sed -n '/pattern/p' filename
选项与参数:
-n :只显示匹配处理的行(否则会输出所有)(也就是关闭默认的输出)
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
- 删除指定行
//删除第N行:
sed -i 'Nd' filename
//删除第N~M行:
sed -i 'N,Md' filename #file的[N,M]行都被删除
- 打印pattern 行的下一行
#匹配出以a开头并以a结尾的后1行:
sed -n '/^a$/,+1p' test.log
#打印出符合开头是a的记录的下一行
sed -n '/a/ {n;p}' test.log
https://blog.csdn.net/iteye_12490/article/details/82480019
- 匹配行上一行
匹配行前一行
1、
sed执行模板=sed ‘模式{命令1;命令2}’
即逐行读入模式空间,执行命令,最后输出打印出来
2、
为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间开端至\n的内容,并追加到默认输出之前。
sed并不对每行末尾\n进行处理,但是对N命令追加的行间\n进行处理,因为此时sed将两行看做一行。
2-1、n命令
n命令简单来说就是提前读取下一行,覆盖模型空间前一行(并没有删除,因此依然打印至标准输出),如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后的任何命令,并对新读取的内容,重头执行sed。
2-2、N命令
N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符,如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后任何命令,并对新读取的内容,重头执行sed。
2-6、h命令,H命令,g命令,G命令
h命令是将当前模式空间中内容覆盖至保持空间,H命令是将当前模式空间中的内容追加至保持空间
g命令是将当前保持空间中内容覆盖至模式空间,G命令是将当前保持空间中的内容追加至模式空间
2-7、x命令
x命令是将当前保持空间和模式空间内容互换
-
-e 使用多个编辑命令
-
寻址
sed '2s/dog/cat/' filename
sed '2,10s/dog/cat/' filename
sed '2,$s/dog/cat/' filename
sed '2,+10p' filename
sed '1,/pattern/d' filename
sed '/pattern1/,/pattern2/d' filename
-
{}
-
= 打印行号
sed '=' filename
-
sed 同时更改多个文件
https://blog.csdn.net/weixin_39060517/article/details/123421699?spm=1001.2014.3001.5501 -
sed修改包含关键词的行
sed -i “/关键词1|关键词2|关键词3/s/^(.*)$/#\1/g” 文件名
这个\1表示前面那个括号里的内容,这条的意思就是把符合关键词的一整行前面加个井号
如果有其他的修改需求,就可以根据行的特点多加几个括号,然后用\1 \2什么的拼接一下。括号和或符号|别忘了加转义
sed命令在这之上,还缓冲了另外一个东西。那就是“上一行的内容” ,叫做hold space。而当前行,叫做patter space。