要想靈活的並按照需要處理文本,我們需要充分的學會並掌握三大文本處理工具,grep、sed(數據流編輯器)、awk(報告文本的生成器)
下面介紹並學習sed命令的基本用法
sed又名stream editer,是行編輯器(編輯器包括字處理器和文本編輯器),是文本編輯器,是操作純Ascii碼文本的,操作文本是按行進行操作的,逐行處理文本,默認並不直接處理文本本身,操作時是將文本逐行讀取到內存中,在內存中處理後並將符合模式匹配到的行顯示到屏幕上,內存空間稱爲sed模式空間。 默認是打印模式空間。
SYNOPSIS
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
sed [OPTION]... 'AddressCommand' file....地址加命令
$:表示文本中的最後一行
Option:
-n:表示靜默模式,不顯示模式空間中的內容,只與命令相關
-i:直接修改原文件
-e script -e script:可以同進執行多個腳本
-f /path/to/sed_script: 表示讀取文件中的腳本對文本進行處理
sed -f /script file..
-r:表示使用擴展正則表達式
Address:
1、startline,endline,如1,10指從第一行到第10行;
2、/pattern(regexp正則表達式)/,如/^root/找出以root開頭的行
3、/pattern1/,/pattern2/,表示第一次被模式1匹配到的行和第一次被模式2匹配到的行中間所有的行。
4、linenumber表示批定的行或特定的行
5、startline,+N,表示從startline開始後的N行,總共是N+1行;
Command:
d:表示刪除符合條件的行;
如:刪除/etc/fstab文件中的前四行,如第一行到倒數第二行,則爲1,$-1
[root@station01 ~]# sed "1,4d" /etc/fstab
如:刪除包含sys的行
[root@station01 ~]# sed "/sys/d" /etc/fstab
如:刪除第一行開始向後十行的內容
[root@station01 ~]# sed "1,+10d" /etc/fstab
如:只刪除第五行則
[root@station01 ~]# sed "5d" /etc/fstab
p:表示顯示符合條件的行,默認顯示模式空間中的一次和命令匹配到的一次,共二次
如:顯示文件中以/開頭的行,並只顯示符合條件的行
[root@station01 ~]# sed -n "/^\//p" /etc/fstab
a \sting:在批定或匹配到的行後面新增一行,內容爲string
如:在/開頭的行後新增一行,內容爲“# It is a blank line.”
[root@station01 ~]# sed '/^\//a \# It is a blank line.' /etc/fstab
如:在/開頭的行後新增兩行,內容爲“# It is first blank line.”“# It is second blank line.”
[root@station01 ~]# sed '/^\//a \# It is first blank line.\n# It is second blank line' /etc/fstab
i \sting:在批定或匹配到的行前面新增一行,內容爲string
r filename:表示在指定的行後將指定的文件內容添加進來,用於合併文件內容
如:將/etc/issue文件的內容添加到/etc/fstab文件的第二行後
[root@station01 ~]# sed '2r /etc/issue' /etc/fstab
如:將/etc/issue文件的內容添加到/etc/fstab文件的第一行和第二行後
[root@station01 ~]# sed '1,2r /etc/issue' /etc/fstab
w filename:將批定範圍內的內容另存至指定的文件中
如:將包含oot中的文件內容保存到/tmp/oot.tmp文體中,可以使用-n選項
[root@station01 ~]# sed '/oot/w /tmp/oot.tmp' /etc/fstab
s/pattern(可以用正則表達式的元字符)/string/修飾符:表示查找匹配到的pattern字符串並替換爲string,默認是每一行中第一次被模式匹配到的字符串,如需要替換行中被模式匹配到的所有字符串,則需要加修飾符;其中的/可以換成其它的字符,確保一致即可,並且不需要轉義,如###,@@@,%%%等
g:全局替換修飾符
i:查找時忽略大小寫
如:將/etc/fstab中包含小寫oot的字符串替換爲大寫的OOT
[root@station01 ~]# sed 's/oot/OOT/' /etc/fstab
如:將/etc/fstab中以/開頭的行中的/替換爲#
[root@station01 ~]# sed 's/^\//#/' /etc/fstab
如:將/etc/fstab中的所有/替換爲#
[root@station01 ~]# sed 's/\//#/g' /etc/fstab
後向引用:
\(\):\1,\2 等
&:表示模式匹配到的整個串
如找出以l開頭e結尾中間是任意兩個字符,替換爲在其後加r
文件內容如下:
[root@station01 ~]# cat sed.txt he like. her love.
#1)執行結果如下:
[root@station01 ~]# sed 's%l..e%&r%' sed.txt he liker. her lover. #2) [root@station01 ~]# sed 's%\(l..e\)%\1r%' sed.txt he liker. her lover.
若要匹配查找字符串中的一部分時,只能使用後向引用,而不能用&
如將l..e,like-->Like,love-->Love時,只能用後向引用
執行結果如下:
[root@station01 ~]# sed 's%l\(..e\)%L\1%' sed.txt he Like. her Love.
如將history命令中的執行結果行首空白刪除,並取出行號
[root@station01 ~]# history | sed -r 's#^[[:space:]]+##g' |cut -d' ' -f1
練習題:
1、刪除/etc/grub.conf文件中行首的空白字符
[root@station01 ~]# sed -r 's#^[[:space:]]+##g' /etc/grub.conf
2、替換/etc/inittab文件中行中id:3:initdefault:字符串中的3改爲6
[root@station01 ~]# sed 's#\(id:\)[0-9]\(:initdefault:\)#\16\2#g' /etc/inittab
3、刪除/etc/inittab文件中的空白行
[root@station01 ~]# sed '/^$/d' /etc/inittab
4、刪除/etc/inittab文件行中開頭的#號
[root@station01 ~]# sed 's/^#//g' /etc/inittab
5、刪除某文件中行首的#及其後面的空白字符
文件內容如下
[root@station01 ~]# cat b.txt # It is a blank. #It is second blank.
執行結果:
[root@station01 ~]# sed -r 's%^#[[:space:]]+%%g' b.txt It is a blank. #It is second blank.
6、刪除某文件中行首的空白字符及其後的#
文件內容如5中的文件
[root@station01 ~]# sed -r 's%^[[:space:]]+#%%g' b.txt # It is a blank. It is second blank.
7、取出某路徑的父目錄
[root@station01 ~]# echo "/etc/rc.d/rc4.d/S99local" | sed -r 's@(/.*/)[^/]+/?@\1@g' /etc/rc.d/rc4.d/