sed

  流編輯器,逐行處理文本內容。處理方式由子命令指定,在內存中完成處理,默認不修改源文件。
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
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息