文本處理三工具: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/:被此模式所匹配到的每一行末贾;
#,#:
#,+#:
#, /part1/
/part1/,/part2/
$:最后一行
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'
//查詢(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í)篇》