流編輯器,逐行處理文本內容。處理方式由子命令指定,在內存中完成處理,默認不修改源文件。
java
語法格式:sed 【-選項】 '/過濾篩選/子命令/子命令選項' 文本對象文件
正則表達式
選項:shell
n 靜默模式
apache
i 修改源文件bootstrap
e 屢次執行命令
tomcat
f 指定sed腳本文件bash
r 擴展正則表達式
tcp
過濾篩選:編輯器
1 處理第一行
測試
1,3 第1行開始,到第三行
3,+2 第3行開始處理,日後2行……
/Regular Expression/ 正則表達式匹配相應行
/RE1/,/RE2/ 從匹配到的第一個正則表達式表示的行,到第二個……
子命令:
d 刪除
p 顯示
a 後增長一行內容(a「string」)
i 前增長一行
s 替換內容
r 行後讀取一個文件的內容
w 選定的行輸出到文件
子命令選項:
g 替換時全局替換
例子
$ cat setip.sh ifconfig eth0 190.15.11.26 netmask 255.255.255.0 up ifconfig eth0:0 190.25.12.27 netmask 255.255.255.0 up ifconfig eth1 192.168.11.15 netmask 255.255.255.0 up
1 取出指定行的內容
在腳本中依賴了一個環境變量,並且註釋部分包含了生成環境變量的定義。須要取出這些行的內容能夠這麼用:
$ sed -n '7,8p' example.sh # DATE=`which --skip-alias date` # export ZCW_TS=`$DATE +%Y%m%d%H`
選項「-n」,過濾了其餘內容的顯示;默認狀況下,sed會逐行所有打印。
使用shell變量,獲取行號。在sed中使用shell變量時,須要加上單引號:
$ k=3 $ sed -n '1,'$k'p' example.sh 1 2 3
2 過濾
找出java池程序。
[root@iZ28lyaw0o0Z ~]# netstat -nltp | sed '/java/p' tcp 0 0 127.0.0.1:28005 0.0.0.0:* LISTEN 10109/java tcp 0 0 0.0.0.0:52168 0.0.0.0:* LISTEN 10109/java tcp 0 0 0.0.0.0:28009 0.0.0.0:* LISTEN 10109/java
打印出包含「44」的行,直到文件最後一行。
# sed -n '/44/,/$$/p' test/hhaa.txt
打印出包含某個變量「tmp_datestamp」的行,直到文件最後一行。
# sed -n '/'$tmp_datestamp'/,/$$/p' $TMPFILE
3 替換修改
修改主ip爲181.37.1.43;備用ip爲182.37.4.43。
$ sed '/eth0 /s/190.15.11.26/181.37.1.43/' setip.sh ifconfig eth0 181.37.1.43 netmask 255.255.255.0 up ifconfig eth0:0 190.25.12.27 netmask 255.255.255.0 up ifconfig eth1 192.168.11.15 netmask 255.255.255.0 up $ sed '/eth0:/s/190.25.12.27/182.37.4.43/' setip.sh ifconfig eth0 190.15.11.26 netmask 255.255.255.0 up ifconfig eth0:0 182.37.4.43 netmask 255.255.255.0 up ifconfig eth1 192.168.11.15 netmask 255.255.255.0 up
默認狀況下,替換時只對行中首次匹配的內容替換,一行中全部內容都須要替換,須要顯式指定。
符號「&」表明匹配模式的字串。
# sed 's/one/first-&/' demo.txt
把「空白符」變成「換行符」,便於過濾出有用信息:
[root@iZ286nwssi4Z ~]# ps -p 9003 -o cmd | sed 's/[[:space:]]/\n/g' CMD /usr/lib/jdk/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/home/zhaocai/tomcat-p2p/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/zhaocai/tomcat-p2p/endorsed -classpath /home/zhaocai/tomcat-p2p/bin/bootstrap.jar:/home/zhaocai/tomcat-p2p/bin/tomcat-juli.jar -Dcatalina.base=/home/zhaocai/tomcat-p2p -Dcatalina.home=/home/zhaocai/tomcat-p2p -Djava.io.tmpdir=/home/zhaocai/tomcat-p2p/temp org.apache.catalina.startup.Bootstrap start
4 刪除行
刪除第3行
# sed '3d' setip.sh ifconfig eth0 190.15.11.26 netmask 255.255.255.0 up ifconfig eth0:0 190.25.12.27 netmask 255.255.255.0 up
5 插入文本
匹配行的前面、後面分別插入內容
$ sed '/eth0 /iPrimary ip address.' setip.sh Primary ip address. ifconfig eth0 190.15.11.26 netmask 255.255.255.0 up ifconfig eth0:0 190.25.12.27 netmask 255.255.255.0 up ifconfig eth1 192.168.11.15 netmask 255.255.255.0 up $ sed '/eth0 /aSlave ip address.' setip.sh ifconfig eth0 190.15.11.26 netmask 255.255.255.0 up Slave ip address. ifconfig eth0:0 190.25.12.27 netmask 255.255.255.0 up ifconfig eth1 192.168.11.15 netmask 255.255.255.0 up
6 組合命令
須要帶上選項「-e」,執行多個「子命令」。 保留列頭部分,剔除java之外的信息。
[root@iZ28lyaw0o0Z ~]# netstat -nltp | sed -e '1,2p' -e '/java/p' Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:28005 0.0.0.0:* LISTEN 10109/java tcp 0 0 0.0.0.0:52168 0.0.0.0:* LISTEN 10109/java tcp 0 0 0.0.0.0:28009 0.0.0.0:* LISTEN 10109/java
獲取文件的修改時間,文件多了還要能看清楚文件與時間對應關係。
#!/bin/bash # if [ 0 -eq $# ]; then echo "Warning, without parameters." exit 1 fi stat $@ | sed -n -e '/File:/p' -e '/Modify:/p' 2> /dev/null
測試運行:
# modTime Warning, without parameters. # modTime zcw_Virtualfile-1.3.sh File: ‘zcw_Virtualfile-1.3.sh’ Modify: 2017-02-08 16:19:32.239958148 +0800
7 使用sed腳本
把多條子命令放在一個sed腳本中,使用「-f」選項一次執行: sed -f sed.script setip.sh
$ cat sed.script /eth0 /i# Primary ip address. /eth0 /a# Slave ip address. $ sed -f sed.script setip.sh # Primary ip address. ifconfig eth0 190.15.11.26 netmask 255.255.255.0 up # Slave ip address. ifconfig eth0:0 190.25.12.27 netmask 255.255.255.0 up ifconfig eth1 192.168.11.15 netmask 255.255.255.0 up
還能夠直接使用sed腳本處理目標文本。相似bash shell腳本同樣,首行指定解釋該腳本的命令"#!/bin/sed -f"。
$ cat sed.script #!/bin/sed -f /eth0 /i# Primary ip address. /eth0 /a# Slave ip address. $ ./sed.script setip.sh # Primary ip address. ifconfig eth0 190.15.11.26 netmask 255.255.255.0 up # Slave ip address. ifconfig eth0:0 190.25.12.27 netmask 255.255.255.0 up ifconfig eth1 192.168.11.15 netmask 255.255.255.0 up
8 子命令r、w
使用「w」命令把eth的配置輸出到文件「eth0.set」中。
$ sed '/eth0/weth0.set' setip.sh $ cat eth0.set ifconfig eth0 190.15.11.26 netmask 255.255.255.0 up ifconfig eth0:0 190.25.12.27 netmask 255.255.255.0 up
一樣能夠從文件讀入一併輸出
$ sed '3reth0.set' setip.sh ifconfig eth0 190.15.11.26 netmask 255.255.255.0 up ifconfig eth0:0 190.25.12.27 netmask 255.255.255.0 up ifconfig eth1 192.168.11.15 netmask 255.255.255.0 up ifconfig eth0 190.15.11.26 netmask 255.255.255.0 up ifconfig eth0:0 190.25.12.27 netmask 255.255.255.0 up