shell腳本之sed詳解 (sed命令 , sed -e , sed s/ new / old / ... )
(一)
Sed是一個非交互性文本流編輯器。它編輯文件或標准輸入導出的文本拷貝。vi中的正則表達式命令在sed中大多可以通用。
##sed常用選項
-e script 指定sed編輯命令
-f scriptfile 指定的文件中是sed編輯命令
-n 寂靜模式,抑制來自sed命令執行過程中的冗余輸出信息,比如只顯示那些被改變的行。
-i[SUFFIX], –in-place[=SUFFIX] 替換和備份源文件
edit files in place (makes backup if extension supplied)
##1. 參數p: 打印匹配行
$ sed -n ’2p’/etc/passwd 打印出第2行 $ sed -n ’1,3p’/etc/passwd 打印出第1到第3行 $ sed -n ‘$p’/etc/passwd 打印出最后一行 $ sed -n ‘/user/p’ /etc/passwd 打印出含有user的行 $ sed -n ‘/\$/p’ /etc/passwd 打印出含有$元字符的行,$意為最后一行 $ sed -n ‘$=’ ok.txt 打印總行數
##2.參數a和i: 插入文本和附加文本(插入新行)
$ sed -n ‘/FTP/p’/etc/passwd 打印出有FTP的行 $ sed ‘/FTP/a\ 456′ /etc/passwd 在含有FTP的行后面新插入一行,內容為456 $ sed ‘/FTP/i\ 123′ /etc/passwd在含有FTP的行前面新插入一行,內容為123 $ sed ‘/FTP/i\ “123″’ /etc/passwd在含有FTP的行前面新插入一行,內容為”123″ $ sed ’5 a\ 123′ /etc/passwd 在第5行后插入一新行,內容為123 $ sed ’5 i\ “12345″’ /etc/passwd 在第5行前插入一新行,內容為”123表達式45″
sed-搜索結果后面增加嵌入代碼
#!/bin/bash #export LANG=zh_CN find ./ -name “*.html” -exec grep 10000008/100 ‘{}’ \; -exec sed -i ‘/10000008/a\<\!--\# include file=\"\/code.html\"--\>‘ {} \; #
##3.參數d:刪除文本
刪空格
sed -i ‘s/[ ]*//g’ ~/$cid.txt
刪除無內容空行
sed ‘/^$/d’ file.conf > file.new.conf sed -i ‘/^$/d’ ~/$cid.txt
刪第一行
sed -i ’1d’ ~/$cid.txt
刪前兩行
sed -i ’1,2d’ ~/$cid.txt
del多行
cat SCTP.log |sed ’1d;2d;$d’
刪除最后一行:
sed -e ‘$d’ file
刪除最后兩行:
sed ‘N;$!P;D’ file
sed ‘N;$!P;$!D;$d’ file
刪除最后n行:
$vi sed.sh
$!/bin/bash
A=$(sed -n ‘$=’ file)
sed $(($A-n+1)),${A}d file $ sed ‘/user/d’/etc/passwd
刪除帶有string的行(del include love row head)
sed -i ‘/^love/d’ file sed -i ‘/love/d’ file
vi刪除包含strings前4行,后34行
:/strings/-4,+34d
刪除配置文件中#號注釋行
sed ‘s#\#.*##’ file.conf > file.new.conf sed ‘s,\#.*,,’
刪除配置文件中//號注釋行
sed ‘s#//.*##’ file.conf > file.new.conf sed ‘s@//.*@@’
刪除由空格和Tab而成的空行
sed ‘/^[[:space:]]*$/d’ file.conf > file.new.conf sed ‘/^[[:space:]]*$/d’
刪除尾行的空格
sed -e ‘s/.$//’ file > file.new.conf
在尾行添加1個空格
sed ‘s/[0-9]$/& /g’ file > flile.new.conf
##4. 參數s:替換文本,替換命令用替換模式替換指定模式,格式為:
[ a d d r e s s [,address]] s/pattern-to-find/replacement-pattern/[g p w n]
$ sed ‘s/user/USER/’/etc/passwd 將第1個user替換成USER,g表明全局替換 $ sed ‘s/user/USER/g’/etc/passwd 將所有user替換成USER $ sed ‘s/user/#user/’/etc/passwd 將第1個user替換成#user,如用於屏蔽作用 $ sed ‘s/user//’/etc/passwd 將第1個user替換成空 $ sed ‘s/user/&11111111111111/’/etc/passwd 如果要附加或修改一個很長的字符串,可以使用( &)命令,&命令保存發現模式以便重新調用它,然后把它放在替換字符串里面,這里是把&放前面 $ sed ‘s/user/11111111111111&/’/etc/passwd 這里是將&放后面 在包含字符串test的任意行上,將111替換成222 $ sed ‘/test/s/111/222/g’ sample.txt
##5. 快速一行正則表達式命令 下面是一些一行命令集。([ ]表示空格,[TAB]表示t a b鍵)
‘s/\ . $//g’ 刪除以句點結尾行 ‘-e/abcd/d’ 刪除包含a b c d的行 ‘s/[ ] [ ] [ ] */[ ]/g’ 刪除一個以上空格,用一個空格代替 ‘s/^ [ ] [ ] *//g’ 刪除行首空格 ‘s/\ . [ ] [ ] */[ ]/g’ 刪除句點后跟兩個或更多空格,代之以一個空格 ‘/^ $/d’ 刪除空行 ‘s/^ .//g’ 刪除第一個字符 ‘s/COL \ ( . . . \ )//g’ 刪除緊跟C O L的后三個字母 ‘s/^ \///g’ 從路徑中刪除第一個\ ‘s/[ ]/[TAB]//g’ 刪除所有空格並用t a b鍵替代 ‘S/^ [TAB]//g’ 刪除行首所有t a b鍵 ‘s/[TAB] *//g’ 刪除所有t a b鍵
##6、用sed刪除文件中的換行符,殺雞哪需牛刀?
tr -d ‘\n’ file
真的需要sed
sed -nr ‘ H;
$ {
x; s/\n//g; p }’
##7、sed獲取ip
[root@c01 ~]# ifconfig eth0|sed -ne ‘s/^.*addr:\([0-9.]*\).*$/\1/p’ 192.168.100.180 [root@c01 ~]# ifconfig eth0 | sed -e ‘/inet/!d’ -e ‘s/.*addr://’ -e ‘s/[ ].*//’ 192.168.100.180
##8、\/轉義字符
echo /usr/local/bin | sed ‘s/\/usr\/local\/bin/\/common\/bin/’ find . -name “*.html” |xargs sed -i ‘s#/canApp/evaluation/html/ index.html#http://www.wallcopper.com/eva/#g’ 都可以把當前目錄下的.c .h文件中的TAB替換成4個空格。 find . -name “*.[c|h]” | xargs sed -i ‘s/\t/ /g’
##9、參數f:
以下三個命令相等,先在包含字符串test的任意行上,將111替換成222,再將字符f替換成hello
$ sed ‘/test/s/111/222/g ; s/f/hello/g’ sample.txt $ sed -e ‘/test/s/111/222/g’ -e ‘s/f/hello/g’ sample.txt
選項-f: 將要執行的所以編譯命令放入在文件中
$ more scher
/test/s/111/222/g s/f/hello/g’ sample.txt $ sed -f scher sample.txt
##10、參數q: 表示跳離sed。最多與一個地址參數配合。
打印出含有a或b字符的行,一旦遇到數字,即刻停止打印。
$ sed -n -e ‘/[0-9]/q’ -e ‘/[a b]/p’ 到china quit sed ‘china/q’ myfile.txt
##11、參數-i后綴:替換並將源文件備份改后綴
$ sed -i.bak ‘s/123/efg/g’ a.txt 備份源文件
##12、參數r:在某行插入文件
$ sed -i ’2 r readfile.txt’ writefile.txt
##13、參數w:讀入文件中的內容存入到另一文件中(temp.txt)。最多與一個地址參數配合。
將sample.txt文件中含test字符串的數據行,copy至temp.txt檔中儲存(原temp.txt中無內容)
$ sed -e ‘/test/w temp.txt’ sample.txt
##14、參數y:轉換數據中的字符。最多與兩個地址參數配合。
1.將文件中的小寫字母替換成大寫字母。
$ sed -e ‘y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/’ sample.txt
其中前后字符個數必須相同.
##15、參數!:表示不執行函數參數。 將文件中除了important字符串,其余全刪除。
$ sed -e ‘/important/!d’ sample.txt
##16、參數=:表示印出資料的行數。最多與兩個地址參數配合。 1.印出文件資料並顯示行數。
$ sed -e ‘=’ sample.txt
計算總行數
$ sed -n ‘$=’ a.txt
##17、其它參數 參數#:表示對文字的注釋。
參數N:表示添加下一筆資料到pattern space內。最多與兩個地址參數配合。(添加下一筆:添加一筆資料后,繼續添加這個資料的下一行數據到pattern space內) 1,將文件中的數據合並。文件內容如下: UNIX LINUX
$ sed -e ‘N’ -e’s/\n/\,/g’ sample.txt
結果如下: UNIX,LINUX
參數D:表示刪除pattern space內的第一行資料。最多與兩個地址參數配合。
參數P:打印出pattern space內的第一行資料。
$ sed -n -e ‘N’ -e ‘P’ sample.txt
利用N將下一行資料(即:偶數行)添加到pattern space內,在利用P打印出奇數行。 解釋過程:由於N的作用,使得每次添加一條資料到pattern space后,先不執行操作,而是繼續添加這個資料的下一行到pattern space內, 然后P參數打印出第一行資料。
參數h:表示暫存pattern space的內容至hold space(覆蓋)。最多與兩個地址參數配合。
參數H:表示暫存pattern space的內容至hold space(添加)。最多與兩個地址參數配合。
參數g:表示將hold space的內容放回至pattern space內。(覆蓋掉原pattern space內的數據)
參數G:表示將hold space的內容放回至pattern space內。(添加大到原pattern space數據之后)
將文件中所有空行刪除,並在每一行后面增加一個空行。
$ sed ‘/^$/d;G’ sample.txt
將文件中所有空行刪除,並在每一行后面增加兩個空行。
$ sed ‘/^$/d;G;G’ sample.txt
參數x:表示交換hold space與pattern space內的數據。
將文件第三行的數據替換成第一行的數據。
$ sed -e ’1h’ -e ’3x’ sample.txt
參數b:
參數t:
如果使用sed對文件進行過濾,最好將問題分成幾步,分步執行,且邊執行邊測試結果。
經驗告訴我們,這是執行一個復雜任務的最有效方式。
參考:
http://www.2cto.com/os/201111/112217.html
http://markmail.org/download.xqy?id=w5pncjwnrs77lz3s&number=2
http://www.grymoire.com/Unix/Sed.html
http://sed.sourceforge.net/sed1line.txt
轉自:
http://www.wallcopper.com/linux/769.html
( 二 )
一, 基本概述
(1)基本介紹
sed是一款流編輯工具,用來對文本進行過濾與替換工作, sed通過輸入讀取文件內容,但一次僅讀取一行內容進行某些指令處理后輸出,sed更適合於處理大數據文件。
(2)工作原理
sed在處理文本文件的時候,會在內存上創建一個模式空間,然后把這個文件的每一行調入模式空間用相應的命令處理,處理完輸出;接着處理下一行,直到最后。
(3)與vim的區別
vim需要通知處理文件的哪幾行才會去處理,sed默認會處理文件的所有行,除非你告訴它不處理哪幾行。
二, sed的基本語法
(1)sed [選項] [定址commands] [inputfile]
關於定址:
定址可以是0個、1個、2個;通知sed去處理文件的哪幾行。
0個:沒有定址,處理文件的所有行
1個:行號,處理行號所在位置的行
2個:行號、正則表達式,處理被行號或正則表達式包起來的行
(2)
選項:
--version 顯示sed版本hao
--help 顯示幫助文檔
-n 關閉默認輸出,默認將自動打印所有行
-e 多點編輯,允許多個腳本指令被執行。
-r 支持擴展正則+ ? () {} |
-i 可以修改原文件,慎用!
-f 支持使用腳本
命令:
p打印行
d 刪除行
s 替換
n替換第幾個匹內容
w另存為
a 之后添加一行
i 當前行之前插入文本
y 替換匹配內容
三, 實際案例講解
(1)p(與-n合用)
查看passwd文件的1~3行
@1,打印一到三行
[root@tx3 ~]# cp /etc/passwd /t1
[root@tx3 ~]# cat -n t1 | sed -n '1,3p'
1root:x:0:0:root:/root:/bin/bash
2bin:x:1:1:bin:/bin:/sbin/nologin
3daemon:x:2:2:daemon:/sbin:/sbin/nologin
@2,查看passwd文件的lp~halt行
[root@tx3 ~]# cat -n t1 |sed -n '/lp/,/halt/p'
5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6sync:x:5:0:sync:/sbin:/bin/sync
7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8halt:x:7:0:halt:/sbin:/sbin/halt
@3, 打印基數行(從第一行開始,每隔一行一輸出)
@4,打印uid是0或1的行
[root@tx3 ~]# sed -n '/x:[01]:/p' t1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
(2)d 刪除
@1,刪除第一行
@2,刪除第一行和第三行(與-e選項合用)
@3,;選項的使用和-e一樣
@4,取反:!
[root@tx3 ~]# cat -n t1 | sed '1!d'
1root:x:0:0:root:/root:/bin/bash
(3)s 查找替換 s///
語法:
'[address]s/pattern/replacement/flags'
old new
flags:
n:1-512 之間的正整數,表示替換模式里面出現的第幾次內容
p:打印
g:全局修改
w:另存為
這幾個選項是可以復合使用的,但是寫的要有意義。(pg ;nw)
注:這里為部分截取
@1默認會替換行里面的第1個匹配
[root@tx3 ~]# sed 's/root/ROOT/' t1
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@2全部替換
[root@tx3 ~]# sed 's/root/ROOT/g' t1
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@3替換第2個匹配
[root@tx3 ~]# sed 's/root/ROOT/2' t1
root:x:0:0:ROOT:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@4打印
[root@tx3 ~]# sed 's/root/ROOT/p' t1
ROOT:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin‘
[root@tx3 ~]# sed -n 's/root/ROOT/p' t1
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
@5另存為
[root@tx3 ~]# sed -n 's/root/ROOT/w /tx' t1
[root@tx3 ~]# cat /tx
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
@6在文件的每行前面添加 # 注釋
[root@tx3 ~]# sed 's/^/#/' t1
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
@7刪掉文件的第1個字符
[root@tx3 ~]# sed 's/^.//1' t1
oot:x:0:0:root:/root:/bin/bash
in:x:1:1:bin:/bin:/sbin/nologin
aemon:x:2:2:daemon:/sbin:/sbin/nologin
@8刪掉文件的第2個字符
[root@tx3 ~]# sed 's/.//2' t1
rot:x:0:0:root:/root:/bin/bash
bn:x:1:1:bin:/bin:/sbin/nologin
(4)i 從當前行插入
在第一行前插入hello
[root@tx3 ~]# sed '1i hello' t1
hello
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
(5)a 從當前行后添加
在第一行后添加hello
[root@tx3 ~]# sed '1a hello' t1
root:x:0:0:root:/root:/bin/bash
hello
bin:x:1:1:bin:/bin:/sbin/nologin
(6)-r 支持擴展正則
[root@tx3 ~]# sed -r 's/^(.)(.)/\1/' t1
rot:x:0:0:root:/root:/bin/bash //相當於把前兩個字符替換成第一個字符,這樣就實現了刪除第二個字符
bn:x:1:1:bin:/bin:/sbin/nologin
demon:x:2:2:daemon:/sbin:/sbin/nologin
其他方法:
@1#sed 's/.//2' t1
@2#sed 's/^..../\1/' t1
(7)y 替換,按照位置來匹配替換 y/// 不識別re
[root@tx3 ~]# sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' t1
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
(8)替換匹配行
@1[root@tx3 ~]# sed -n '1c ROOT' t1
ROOT
(9)q 退出
[root@tx3 ~]# sed '1q ' t1
root:x:0:0:root:/root:/bin/bash
(10)-i 可以修改原文件
(11)-f 支持腳本
四.sed如何處理數據
PATT:模式空間,處理文件的輸入行,處理文件的空間,最多保存8192字節,相當於車間sed把流內容在這里處理。
HOLD:保留空間,用來保存已經處理的輸入行;最多保存8192字節;默認有一個空行,相當於倉庫,加工的半成品在這里臨時儲存。
COMM:命令
h:將模式空間里的內容,復制到保留空間里,覆蓋原來的內容 >
H:將模式空間里的內容,追加到保留空間里,保留原來的內容 >>
g:將保留空間里的內容,復制到模式空間里,覆蓋原來的內容
G:將保留空間里的內容,追加到模式空間里,保留原來的內容
n:對匹配行的下一行進行處理
x:交換模式空間和保留空間的內容
(1)h;G
@1.將第一行的內容放到打三行后面
@2.在每行的后面添加1個空行
注:1.保留空間里默認有一個空白行。2,‘G’默認處理全局
@3.把第1行到第4行的數據復制到第5行后面
注:1h是為了覆蓋保留空間里的空白行
@4. 把第1行到第4行的數據剪切到第5行后面
(2)n 對匹配行的下一行進行處理
(3)x 交換模式空間和保留空間的內容