设为首页 收藏本站
查看: 853|回复: 0

[经验分享] linux命令总结:sed

[复制链接]
YunVN网友  发表于 2018-5-18 07:31:37 |阅读模式
  说明:

  sed用于过滤和转换文本的流编辑器
  可以采用正则匹配,对文本进行插入删除修改等操作

  Sed处理的时候,一次处理一行,每一次把当前处理的存放在临时缓冲区,处理完后输出缓冲区内容到屏幕,然后把下一行读入缓冲区,如此重复,直到处理完最后一行。
  

  用法:
  sed [OPTION] ... {script-only-if-no-other-script} [input-file] ...
  sed [选项] ... [动作] [文件]

  参数:
  -n 安静模式,取消默认输出
-e 直接在命令列上进行sed动作编辑
-f 读取脚本文件内sed命令处理文件
-r sed动作支持延伸的正则表达(默认只是基础正则)
-i 直接修改文件内容(实验时慎用系统文件)
  -u 从输入文件加载少量的数据并刷新更多的输出缓冲区
  --help 显示帮助信息并退出
  --version  输出版本信息并退出
  

  命令:
  :label     是b和t命令的标签,用来实现跳转处理,名字可以随便取(label)
  =     打印当前行号码
  a\    追加,在当前行的下一行追加文本
  i\    插入,在当前行的上一行插入文本
  q    退出,与Q一样
  b label    分行到标签,如果标签被省略,则分支到脚本的末尾。
  t label    如果从上一次做了一个成功的替代,输入行被读取,并且从最后一个t或T命令,然后分支到标签,如果省略则分支到末尾。
  T label    如果没有s///从上一次成功替换输入行被读取,并且从最后一个t或T命令,然后分支到标签。如果省略则分支到末尾。
  c \    用所有嵌入的文本替换所选行,换行符前面加反斜杠。
  d    删除选择的行
  D    删除模版快的第一行
  h H    复制或追加模版块的内容到缓冲区
  g G    获取内存缓存区的内容,并替换或追加到当前模版块文本
  x    交换保留和模式空间的内容
  l    以视觉上明确的形式列出当前行
  n N  将下一行输入读取或附加到模式空间中
  p    打印当前模版块的行
  P    打印莫板块的第一行
  s/// 替换匹配字符,可以使用正则
  w    将当前模式空间写入文件
  W    将当前模式空间的第一行写入文件
  !   表示后面的命令对所有没有被选定的行发生作用

  #    把注释扩展到下一个换行符以前
  sed替换标记
  g   表示行内全面替换
p   表示打印行
w   表示把行写入一个文件
x   表示交换莫板块中的文本和缓冲区中的文本
y   表示把一个字符翻译成另外的字符
\1  子串匹配标记

  &   已匹配字符串标记
  sed 元字符集 :
^     匹配行开始
  $   匹配行结束
  .   匹配一个非换行符的任意字符
  *   匹配0个或多个字符匹配所有模块是一个或多个空格后紧跟sed的行
  []  匹配一个指定范围内的字符
  [^] 匹配一个不再指定范围内的字符
  \(..\) 匹配子串,保存匹配的字符,如 s/\(love\)able/\1rs loveable被替换成lovers
  &    保存搜索字符用来替换其他字符,如s/love/**&**/ love这成**love**
  \<   匹配单词的开始,如 /\<love/匹配包含以love开头的单词行
  \>   匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行
  x\{m\}   重复字符x,m次,如 /0{5\}/匹配包含5个0的行
  x\{m,\}  重复字符x,至少m次,如 /0\{5,\}/匹配至少有5个0的行
  x\{m,n\} 重复字符x ,至少m次,不多于n次,如 /0\{5,10\}/匹配5~10个0的行
  

  实例:
  替换操作 :s命令
  替换文本中的字符串
[root@zxq ~]# sed 's/aa/99/' aa.txt
99  123  345 aa bb cc dd bb ee
bb 123 333 444 333 222 bb  -n 选项和p选项一起使用表示只打印发生变化的行
[root@zxq ~]# sed -n 's/aa/www.baidu.com/p' aa.txt
www.baidu.com  123  345 aa bb cc dd bb ee  直接编辑文件选项-i,会匹配文件中每一行匹配的内容
[root@zxq ~]#sed -i 's/aa/888/g' aa.txt   #全面替换标记g
[root@zxq ~]# cat aa.txt
888  123  345 888 bb cc dd bb ee
bb 123 333 444 333 222 bb  当需要从第N出匹配开始替换时,可以使用/Ng:
[root@zxq ~]# echo ababababababab | sed 's/ab/AB/2g'
abABABABABABAB
[root@zxq ~]# echo ababababababab | sed 's/ab/AB/3g'
ababABABABABAB
[root@zxq ~]# echo ababababababab | sed 's/ab/AB/4g'
abababABABABAB
[root@zxq ~]# echo ababababababab | sed 's/ab/AB/5g'
ababababABABAB  以上命令中/在sed中作为定界符使用,也可以使用任意的定界符,例如使用#号将输出内容转换成大写,其中的U在元字符里是大写大意思,&代表已匹配的字符。
[root@zxq ~]# echo abcd |sed 's#[a-z]#\U&#g'
ABCD  删除操作:d命令

删除空白行
sed '/^$/d' file
删除文件的第2行
sed '2d' file
删除文件的第2行到末尾所有行
sed '2,$d' file
删除文件最后一行
sed '$d' file11
删除文件中所有开头的test的行
sed '/^test/d' file  已匹配字符串标记&
正则表达式\w+匹配每一个单词,使用[&]替换它,&对于之前所匹配到的单词
[root@zxq ~]# echo a b c d |sed 's/\w\+/[&]/g'
[a] [c] [d]  &代表前面匹配的内容然后加上后面需要替换的内容:
[root@zxq ~]# echo "202.106.0.20"|sed 's/202.106.0.20/&DNS/g'
202.106.0.20DNS  子串匹配标记 \1
匹配给定样式的其中一部分,第一个使用\1第二个使用\2,下面是截取IP和mac地址
[root@zxq ~]# ifconfig eth0|sed -n 's/^.*addr:\(.*\)  .*  Mask:\(.*\)$/ip:\1 mac:\2/gp'
ip:10.0.0.4 mac:255.255.255.0  命令中第一个()内的内容匹配\1,第二个()内大内容匹配\2,依此类推
例如:[a-z]+代表任意字符后面的+是多个的意思,此处使用-r选项使用延伸的正则表达式,就不需要对特殊字符转义了。
[root@zxq ~]# echo "aaa BBB"|sed -r 's/([a-z]+) ([A-Z]+)/\2 \1/'
BBB aaa  引用
sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号
[root@zxq ~]# aa=mysql;echo "this is sqlserver"|sed 's/sqlserver/$aa/'
this is $aa
[root@zxq ~]# aa=mysql;echo "this is sqlserver"|sed "s/sqlserver/$aa/"
this is mysql  选定行的范围: ,逗号
所有在模板bbb和ddd所确定的范围内的行都被打印
[root@zxq ~]# echo -e "aaa\nbbb\nccc\nddd"|sed -n '/bbb/,/ddd/p'
bbb
ccc
ddd  打印从第2行开始到第一个包含以ccc开始的行之间的所有行包括ccc:
[root@zxq ~]# echo -e "aaa\nbbb\nccc\nddd"|sed -n '2,/^ccc/p'
bbb
ccc  对于aaa和ccc之间的行,每行的末尾追加www.com
[root@zxq ~]# echo -e "aaa\nbbb\nccc\nddd"|sed '/aaa/,/ccc/s/$/www.com/'
aaawww.com
bbbwww.com
cccwww.com
ddd  多点编辑:e 命令
[root@zxq ~]# echo -e "aaa\nbbb\nccc\nddd\neee"|sed -e '1,3d' -e 's/eee/www/'
ddd
www  上面sed表达式的第一条命令删除1至3行,第二条命令用eee替换www,命令的执行顺序对结果有影响,如果两个 命令都是替换命令,那么第一个命令将 影响第二个替换命令的结果
  和-e等价的命令是–expression
[root@zxq ~]# echo -e "aaa\nbbb\nccc\nddd\neee"|sed --expression 's/aaa/MMM/' --expression 's/eee/www/'
MMM
bbb
ccc
ddd
www  从文件读入: r命令
file里面的内容被读进来,显示在与aaa匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的后面sed '/aaa/r filename
[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed '/aaa/r aa.txt'
aaa
www.org
blog.com
bbb
aaa
www.org
blog.com
ddd
eee  从文件写入:w命令
  将匹配的行写入到文件内,注意会覆盖原文件内容
[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n '/aaa/w aa.txt'
[root@zxq ~]# cat aa.txt
aaa
aaa  追加: a\ 命令
将www.gun.org追加到以aaa开头的行后面

[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed '/^aaa/a\www.gun.org'
aaa
www.gun.org
bbb
aaa
www.gun.org
ddd
eee  在文件第2行之后追加www,centos.org

[root@zxq ~]# sed -i '2a\www.centos.org' aa.txt
[root@zxq ~]# cat aa.txt
aaa
aaa
www.centos.org  插入: i\ 命令
  在匹配的行前面插入内容
[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed '/^aaa/i\www.gun.org'
www.gun.org
aaa
bbb
www.gun.org
aaa
ddd
eee  下一个 n/N 命令
:label将存储一个标签位置,使用N追加下一行文本到此空间,此处就有了两行文本(aa$bb),然后使用s/\n//p替换功能替换换行符(\n),输出aabb,b将跳转标签位为bb后,赋值给label。然后逐行执行语句到行尾。
[root@pjy ~]# cat a.txt
aa
bb
cc
[root@pjy ~]# sed ':label;N;s/\n//p;b label' a.txt
aabb
aabbcc
aabbcc  变形: y命令
把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令
[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed '1,4y/abcde/ABCDE/'
AAA
BBB
AAA
DDD
eee  退出 q命令
打印完第10行后,退出sed
  sed '10q' file
  打印奇数行或偶数行
  方法1,使用n命令下一行打印
打印奇数行:
[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n 'p;n'
aaa
aaa
eee
打印偶数行:
[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n 'n;p'
bbb
ddd  方法2,指定从第几行开始打印,后面数字指定间隔几行打印
[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n '1~2p'
aaa
aaa
eee
[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n '2~2p'
bbb
ddd  打印匹配字符串的下一行
[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed -n '/ddd/{n;p}'
eee  使用b做跳转,当判断字符为aaa时b就跳转到x,此处的:x为定义的标签,标签后为执行的动作。匹配字符aa就跳转到x执行动作,在aa后面添加制表符和YES,如果不为aa就不跳转直接执行后面的s/$/\tYES/,在后面添加制表符和YES。
[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed '/^aaa/bx;s/$/\tNO/;b;:x;s/$/\tYES/'
aaaYES
bbbNO
aaaYES
dddNO
eeeNO
使用t做跳转时,如果有一次成功的替换则读入最后一个T或t命令,此处还是不太明白,有懂的大神希望留言告知。
[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed '/^aaa/tx;s/$/\tNO/;t;:x;s/$/\tYES/'
aaaNO
bbbNO
aaaNO
dddNO
eeeNO
使用T做跳转时,如果有一次成功的替换则读入最后一个T或t命令,使用取反跳转,此处还是不太明白,有懂的大神希望留言告知。
[root@zxq ~]# echo -e "aaa\nbbb\naaa\nddd\neee"|sed '/^aaa/Tx;s/$/\tNO/;T;:x;s/$/\tYES/'
aaaYES
bbbNOYES
aaaYES
dddNOYES
eeeNOYES  分析多行日志取IP和mac地址并做统计实例:
grep -wE '^lease|hardware' $patha/dhcpd.leases|sed ':x;N;s/{\n//;b x'|sed -n "s/;$//gp"|awk 'BEGIN{print "IP""\t\t""MAC"} {print $2"\t"$5}' >$patha/ip_table.txt
cat $patha/ip_table.txt | wc -l > $patha/aa.txt  后期补充。。。。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-461492-1-1.html 上篇帖子: linux命令总结:echo 下篇帖子: 什么是linux,linux的应用与发展
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表