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私房菜--基础学习篇》
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容