文件处理工具系列(二):行编辑器sed
来源:互联网 发布:淘宝联盟怎么分享图片 编辑:程序博客网 时间:2024/06/08 16:23
1、sed介绍
sed(Stream EDitor),是一种行编辑工具,它一次处理一行内容。处理时,把当前匹配到的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令对这些数据做出相应的增删改查操作,处理完成后,默认输出至屏幕,而未被匹配到的行也将默认输出至屏幕。而原来的文件内容并没有发生改变,除非使用重定向存储输出。
2、sed用法
<1>语法格式
sed [option]... 'addressCOMMAND' inputfile...
<2>[option]
-n 不输出模式空间和未匹配到的数据-e 多点编辑-r 支持使用扩展的正则表达式-f FILE 从指定文件中读取编辑脚本-i 原处编辑[root@centos7 ~]# cat > sed.txt2p^C[root@centos7 ~]# sed -n -f sed.txt /etc/passwdbin:x:1:1:bin:/bin:/sbin/nologin
[root@centos7 ~]# sed -i.bak '4,$d' /tmp/fstab [root@centos7 ~]# ls /tmp/fstab fstab.bak functions
注:虽然可通过sed -i.bak '4,$d' /tmp/fstab类似的方式处理/tmp/fstab文件,而且会在/tmp目录下生成fstab.bak备份的文件,但依然不建议在生产生活中使用
<3>address
不给地址 对全文进行搜索单地址 # 指定的行 pattern 被模式匹配到的每一行地址范围 #,# 指定的行到指定的行 #,+# 指定的行到下几行 pat1,pat2 第一次被某模式匹配到的行到最后一次被某模式匹配到的行 #,pat1 第几行到最后一次被某模式匹配到的行步进 1~2 奇数行 2~2 偶数行<4>COMMAND(增删改查)
a \text\:在行后面追加文本,支持使用\n实现多行追加
i \text\:在行前面插入文本,支持使用\n实现多行插入
d:删除模式空间匹配到的行
c \text\:替换为单行或多行文本
特殊 s///:查找替换,支持使用其它分隔符,s@@@,s###
g:全局替换
p:显示模式空间中的行
注:此命令一般与-n选项同用,否则匹配到的内容会显示俩次
w /path/to/somefile:保存模式匹配到的行至指定文件,一般也会与-n同用
[root@centos7 ~]# sed -n '/UUID/w /tmp/fstab.tmp' /etc/fstab[root@centos7 ~]# cat /tmp/fstab.tmp UUID=cb86b5f6-3ea1-48b6-ad1d-5a77cf565d5b /boot xfs defaults 0 0
r /path/from/somefile:从指定的文件中读数据写入文本
[root@centos7 ~]# cat ahaha[root@centos7 ~]# sed '/Kernel/r a' /etc/issue\SKernel \r on an \mhaha
sed常用方式
<1>sed取标准行
[root@centos7~]#sed -n 3p /etc/fstab # /etc/fstab
<2>sed取标准行以及直接处理
[root@centos7~]#sed -nr 's/UUID=(.*) \/b.*/\1/p' /etc/fstab cb86b5f6-3ea1-48b6-ad1d-5a77cf565d5b
针对以上知识点,做以下加强练习
1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符
[root@centos7 ~]# sed -r 's@^[[:space:]]\+@@' /etc/grub2.cfg
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
[root@centos7 ~]# sed -r 's@^#[[:space:]]+@@' /etc/fstab
3、在/etc/fstab每一行行首增加#号
[root@centos7 ~]# sed -e 's@^@#&@' -e 's@^$@#@' /etc/fstab
或者
[root@centos7 ~]# sed 's@^.*@#&@' /etc/fstab
注意:此处不可写成sed 's@^(.*)@#$@' /etc/fstab,这是错误的,此处锚定的是(),而不是行首
空白行锚定使用^$
[root@centos7 ~]# cat > f1()ab^C[root@centos7 ~]# sed 's@^(.*)@#&@' f1#() ab
4、在/etc/fstab文件中不以#开头的行的行首增加#号
[root@centos7 ~]# sed 's@^[^#]@#&@' /etc/fstab
5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
[root@centos7 ~]# echo /etc/fstab | sed -r 's@(.*/)([^/]+/?$)@\1@'/etc/[root@centos7 ~]# echo /etc/fstab | sed -r 's@(.*/)([^/]+/?$)@\2@'fstab
6、利用sed 取出ifconfig命令中本机的IPv4地址
[root@centos7 ~]# ifconfig | sed -n '2p' | sed -e 's@.*inet[[:space:]]@@' -e 's@[[:space:]].*@@'
或者
[root@centos7 ~]# ifconfig | sed -n '2p' | sed -r 's@.*inet[[:space:]](.*)[[:space:]]net.*@\1@'10.1.0.17
当然,如果使用cut就简单多了
[root@centos7 ~]# ifconfig | sed -n '2p' | tr -s ' ' | cut -d' ' -f310.1.0.17
7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
[root@centos7 Packages]# ls | grep "rpm$" | sed -e 's@.rpm$@@' -e 's@.*\.@@' | sort | uniq -c 2000 i686 2938 noarch 4069 x86_64
或者
[root@centos7 Packages]# ls | grep "rpm$" | sed -r 's@.*\.(.*)\.rpm@\1@' | sort | uniq -c 2000 i686 2938 noarch 4069 x86_64
8、统计/etc/init.d/function中每个单词的重复次数,并倒序排列
[root@centos7/etc/yum.repos.d]#cat /etc/init.d/functions | tr -c '[:alpha:]' '\n' | tr -s '\n' | sort | uniq -c | sort -nr
注意常见的错误
使用正则表达式注意.的转义
使用扩展正则表达式注意分组时要加-r
再或者
[root@centos7 Packages]# ls | grep "rpm$" | rev | cut -d. -f2 | sort | uniq -c 4069 46_68x 2000 686i 2938 hcraon
总结:个人认为,sed命令是grep命令的延伸,虽然有些功能比如筛选同样的行时,俩者都可实现,但是如果数据量很大的话,相比而言,grep是更加方便的。所以grep筛选数据,sed再处理数据,这样无疑是最好的结果。至于截取特定的字段的话,cut、tr、grep和sed同样都可以实现,而sed又无疑是这三个里面最强大的(分组截取字段),所以这些要勤加练习,才能掌握的游刃有余。
- 文件处理工具系列(二):行编辑器sed
- Linux指令_文件处理工具sed
- sed编辑器(二)
- 文本处理工具sed
- 文本处理工具sed
- 文本处理工具sed
- Linux文件格式化与相关处理及sed工具
- sed行编辑器
- Linux文本处理–sed命令编辑器
- Linux-sed文本处理流编辑器
- sed进行文件简单处理
- sed行编辑器使用介绍
- linux文本处理工具之sed
- Unix文本处理工具之sed
- Unix文本处理工具之sed
- Linux文本处理工具之sed
- linux之sed用法 (文本处理工具)
- sed编辑器
- ubuntu APT-GET工作原理
- Java 内存区域和GC机制
- 设计模式——代理(Proxy)
- 关于JavaScript调试的十来个小Tips
- HttpURLConnection用法详解
- 文件处理工具系列(二):行编辑器sed
- Pashmak and Garden
- poj 3667 Hotel 线段树区间合并
- 如何线程安全的使用HashMap
- 题目1——数房子
- <Android 应用 之路> MPAndroidChart~LineChart
- vim编辑器进阶
- C安全编程知识点
- java 如何保留数据后两位小数