Linux文本處理三劍客——sed

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

  • grep:文本過(guò)濾工具:pattern
  • sed:行編輯器:模式空間、保持空間
  • awk:報(bào)告生成器:格式化文本輸出萌腿;

sed命令

1.sed命令概述

  • sed是一種行編輯器,一次處理一行內(nèi)容抖苦;
  • sed處理文本的過(guò)程:將當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中毁菱,該緩沖區(qū)稱(chēng)為“模式空間”米死;用sed命令處理緩沖區(qū)中的內(nèi)容,處理完畢后贮庞,把緩沖區(qū)的內(nèi)容送到標(biāo)準(zhǔn)輸出峦筒;
  • sed處理的整個(gè)過(guò)程中,對(duì)象文件的內(nèi)容沒(méi)有改變窗慎,除非使用重定向來(lái)存儲(chǔ)處理后的結(jié)果物喷;
  • sed所具有的功能:數(shù)據(jù)的替換、刪除捉邢、新增等脯丝,這里的數(shù)據(jù)可以是一些關(guān)鍵字商膊,也可以是一些特定的行伏伐。

2.sed命令

命令格式

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

常用選項(xiàng)

-n:不輸出模式空間中的內(nèi)容至屏幕;
-e:直接在命令行上進(jìn)行sed的動(dòng)作編輯晕拆;
-f :直接將sed的動(dòng)作寫(xiě)在一個(gè)文件內(nèi)藐翎,-f filename則可以執(zhí)行filename內(nèi)的sed動(dòng)作;
-r:支持使用擴(kuò)展正則表達(dá)式实幕;
-i:直接編輯源文件吝镣;(危險(xiǎn)操作)

地址定界

  • (1)空地址:對(duì)全文進(jìn)行處理;
  • (2)單地址:
 #:指定行昆庇;
/pattren/:被此模式所匹配到的每一行末贾;
  • (3)地址范圍
#,#:
#,+#:
#, /part1/
/part1/,/part2/
$:最后一行
  • (4)步進(jìn):~
1~2:所有奇數(shù)行
2~2:所有偶數(shù)行

編輯命令

d:刪除
p:顯示模式空間中的內(nèi)容;
a \text:在行后面追加文本“text”整吆,支持使用\n實(shí)現(xiàn)多行插入拱撵;
i \text:在行前面插入文本“text”,支持使用\n實(shí)現(xiàn)多行插入表蝙;(危險(xiǎn)操作)
c \text:把匹配到的行替換為此處指定的文本“text”拴测;
w /PATH/TO/SOMEFILE:保持模式空間匹配到的行至指定的文件中;
r  /PATH/TO/SOMEFILE:讀取指定文件的內(nèi)容至當(dāng)前文件被模式匹配到的行處府蛇;實(shí)現(xiàn)文件合并集索;
=:為模式匹配到的行打印行號(hào);
!:條件取反汇跨;
s///:查找替換务荆,其分隔符可自行指定,常用的有s@@@穷遂,s###等蛹含;

替換標(biāo)記

g:全局替換;
w /PATH/TO/SOMEFILE:將替換成功的結(jié)果保存至指定的文件中塞颁;
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的內(nèi)容打印出來(lái)并且打印行號(hào)吸耿,同時(shí),將第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行的內(nèi)容替換為“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文件內(nèi)的第5-7行
//命令中加-n,否則5~7行會(huì)重復(fù)輸出
[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
部分?jǐn)?shù)據(jù)的查找并替換功能
sed 's/要被替換的字符串/新的字符串/g'
  • 取得ip數(shù)據(jù)
//查詢(xún)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 
//利用關(guān)鍵字配合grep選取出關(guān)鍵字的一行數(shù)據(jù)
[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字樣但不含有#在內(nèi)的批注以及空白行的幾行數(shù)據(jù),
//先用grep將關(guān)鍵字MAN所在的行取出來(lái)
[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
......
//刪除掉批注之后的數(shù)據(jù)
[root@localhost ~]# cat /etc/man.config | grep 'MAN' | sed 's/#.*$//g'






MANPATH /usr/man
//原本批注的數(shù)據(jù)都變成空白行
......
//刪除掉空白行
[root@localhost ~]# cat /etc/man.config | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'
MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man

練習(xí)

  • 練習(xí)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
  • 練習(xí)2:刪除/etc/fstab文件中所有以#開(kāi)頭的行的行首的#號(hào)及#號(hào)后面的所有空白字符;
[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
#
......
  • 參考書(shū)籍
    《鳥(niǎo)哥的Linux私房菜--基礎(chǔ)學(xué)習(xí)篇》
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末船殉,一起剝皮案震驚了整個(gè)濱河市鲸睛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疲迂,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,185評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異糕珊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)毅糟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)红选,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人姆另,你說(shuō)我怎么就攤上這事喇肋。” “怎么了迹辐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,684評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蝶防,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我明吩,道長(zhǎng)间学,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,564評(píng)論 1 284
  • 正文 為了忘掉前任印荔,我火速辦了婚禮低葫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躏鱼。我一直安慰自己氮采,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布染苛。 她就那樣靜靜地躺著鹊漠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茶行。 梳的紋絲不亂的頭發(fā)上躯概,一...
    開(kāi)封第一講書(shū)人閱讀 49,874評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音畔师,去河邊找鬼娶靡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛看锉,可吹牛的內(nèi)容都是我干的姿锭。 我是一名探鬼主播塔鳍,決...
    沈念sama閱讀 39,025評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呻此!你這毒婦竟也來(lái)了轮纫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,761評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤焚鲜,失蹤者是張志新(化名)和其女友劉穎掌唾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體忿磅,經(jīng)...
    沈念sama閱讀 44,217評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡糯彬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葱她。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撩扒。...
    茶點(diǎn)故事閱讀 38,694評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖览效,靈堂內(nèi)的尸體忽然破棺而出却舀,到底是詐尸還是另有隱情虫几,我是刑警寧澤锤灿,帶...
    沈念sama閱讀 34,351評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站辆脸,受9級(jí)特大地震影響但校,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜啡氢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評(píng)論 3 315
  • 文/蒙蒙 一状囱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倘是,春花似錦亭枷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,778評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瘤睹,卻和暖如春升敲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轰传。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,007評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工驴党, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人获茬。 一個(gè)月前我還...
    沈念sama閱讀 46,427評(píng)論 2 360
  • 正文 我出身青樓港庄,卻偏偏與公主長(zhǎng)得像倔既,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹏氧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容