Linux文本处理三剑客——sed

文本处理三工具:grep,sed,awk

  • grep:文本过滤工具:pattern
  • sed:行编辑器:模式空间、保持空间
  • awk:报告生成器:格式化文本输出;

sed命令

1.sed命令概述

  • sed是一种行编辑器,一次处理一行内容;
  • sed处理文本的过程:将当前处理的行存储在临时缓冲区中,该缓冲区称为“模式空间”;用sed命令处理缓冲区中的内容,处理完毕后,把缓冲区的内容送到标准输出;
  • sed处理的整个过程中,对象文件的内容没有改变,除非使用重定向来存储处理后的结果;
  • sed所具有的功能:数据的替换、删除、新增等,这里的数据可以是一些关键字,也可以是一些特定的行。

2.sed命令

命令格式

sed [OPTION]... 'script'  [input-file]...
script:地址定界编辑命令

常用选项

-n:不输出模式空间中的内容至屏幕;
-e:直接在命令行上进行sed的动作编辑;
-f :直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作;
-r:支持使用扩展正则表达式;
-i:直接编辑源文件;(危险操作)

地址定界

  • (1)空地址:对全文进行处理;
  • (2)单地址:
 #:指定行;
/pattren/:被此模式所匹配到的每一行;
  • (3)地址范围
#,#:
#,+#:
#, /part1/
/part1/,/part2/
$:最后一行
  • (4)步进:~
1~2:所有奇数行
2~2:所有偶数行

编辑命令

d:删除
p:显示模式空间中的内容;
a \text:在行后面追加文本“text”,支持使用\n实现多行插入;
i \text:在行前面插入文本“text”,支持使用\n实现多行插入;(危险操作)
c \text:把匹配到的行替换为此处指定的文本“text”;
w /PATH/TO/SOMEFILE:保持模式空间匹配到的行至指定的文件中;
r  /PATH/TO/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行处;实现文件合并;
=:为模式匹配到的行打印行号;
!:条件取反;
s///:查找替换,其分隔符可自行指定,常用的有s@@@,s###等;

替换标记

g:全局替换;
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定的文件中;
p:显示替换成功的行;

3.sed功能演示

新增/删除

  • 在/etc/passwd第二行后加上“test add”
[root@localhost ~]# nl /etc/passwd | sed  -e '2a test add'
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
test add
......
  • 将/etc/passwd的内容打印出来并且打印行号,同时,将第2~5行删除
[root@localhost ~]# nl /etc/passwd | sed -e '2,5d'
     1  root:x:0:0:root:/root:/bin/bash
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
......

以行为单位的替换与显示功能

  • 将/etc/passwd文件第2~5行的内容替换为“No 2-5 number”
[root@localhost ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
     1  root:x:0:0:root:/root:/bin/bash
No 2-5 number
     6  sync:x:5:0:sync:/sbin:/bin/sync
  • 仅列出/etc/passwd文件内的第5-7行
//命令中加-n,否则5~7行会重复输出
[root@localhost ~]# nl /etc/passwd | sed -n '5,7p'
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
部分数据的查找并替换功能
sed 's/要被替换的字符串/新的字符串/g'
  • 取得ip数据
//查询ip
[root@localhost ~]# /sbin/ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:48:5F:02  
          inet addr:192.168.0.10  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe48:5f02/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1761880 errors:4 dropped:4 overruns:0 frame:0
          TX packets:85356 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:140153541 (133.6 MiB)  TX bytes:6807963 (6.4 MiB)
          Interrupt:19 Base address:0x2000 
//利用关键字配合grep选取出关键字的一行数据
[root@localhost ~]# /sbin/ifconfig eth0 | grep 'inet addr'
          inet addr:192.168.0.10  Bcast:192.168.0.255  Mask:255.255.255.0
//将ip前面的部分予以删除
[root@localhost ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.0.10  Bcast:192.168.0.255  Mask:255.255.255.0
//将ip后面的部分予以删除
[root@localhost ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.0.10  
  • 取出含有MAN字样但不含有#在内的批注以及空白行的几行数据,
//先用grep将关键字MAN所在的行取出来
[root@localhost ~]# cat /etc/man.config | grep 'MAN'
# when MANPATH contains an empty substring), to find out where the cat
# MANBIN        pathname
# MANPATH       manpath_element [corresponding_catdir]
# MANPATH_MAP       path_element    manpath_element
# MANBIN        /usr/local/bin/man
# Every automatically generated MANPATH includes these fields
MANPATH /usr/man
......
//删除掉批注之后的数据
[root@localhost ~]# cat /etc/man.config | grep 'MAN' | sed 's/#.*$//g'






MANPATH /usr/man
//原本批注的数据都变成空白行
......
//删除掉空白行
[root@localhost ~]# cat /etc/man.config | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'
MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man

练习

  • 练习1:删除/etc/grub.conf文件中所有行的行首的空白字符
//查看/etc/grub.conf文件
[root@localhost ~]# cat /tmp/grub.conf 
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-279.el6.i686)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-279.el6.i686 ro root=UUID=e31be215-2c21-45f2-a43f-1a9c6bc383f2 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
    initrd /initramfs-2.6.32-279.el6.i686.img
//删除行首的空白字符
[root@localhost ~]# sed 's/^[[:space:]]\+//' /tmp/grub.conf 
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-279.el6.i686)
root (hd0,0)
kernel /vmlinuz-2.6.32-279.el6.i686 ro root=UUID=e31be215-2c21-45f2-a43f-1a9c6bc383f2 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-279.el6.i686.img
  • 练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#号后面的所有空白字符;
[root@localhost ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sun Jul  2 04:16:54 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
......
[root@localhost ~]# sed 's/^#[[:space:]]\+//' /etc/fstab

#
/etc/fstab
Created by anaconda on Sun Jul  2 04:16:54 2017
#
Accessible filesystems, by reference, are maintained under '/dev/disk'
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
......
  • 参考书籍
    《鸟哥的Linux私房菜--基础学习篇》
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容