天天看點

shell 正則表達三劍客--sed

sed 指令

sed是一種線上編輯器,一次處理一行内容。處理時,把目前處理的行存儲在臨時緩沖區中,稱為“模式空間”,接着用sed指令處理緩沖區中的内容,處理完成後,把緩沖區的内容送往螢幕。接着處理下一行,這樣不斷重複,直到檔案末尾。檔案内容并沒有改變,除非你使用重定向存儲輸出。

參數:

-n :隻有經過sed 特殊處理的那一行(或者動作)才會被列出來

-e :直接在指令列模式上進行 sed 的動作編輯;

-f :直接将 sed 的動作寫在一個檔案内

-r :sed 的動作支援的是延伸型正規表示法的文法

-i :直接修改讀取的檔案内容,而不是輸出到終端

a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)

c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行

d :删除,因為是删除啊,是以 d 後面通常不接任何内容

i :插入, i 的後面可以接字串,而這些字串會是新的一行

p :列印,将某個選擇的資料輸出

s :取代,直接進行取代,通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 

常用示例:

删除:d指令  

$ sed '2d' filename-----删除filename檔案的第二行。  

$ sed '2,$d' filename-----删除filename檔案的第二行到末尾所有行。  

$  sed '$d' filename-----删除filename檔案的最後一行。   

$ sed '/test/'d filename-----删除filename檔案所有包含test的行。  

替換:s指令   

$ sed 's/test/mytest/g' filename-----在整行範圍内把test替換為mytest。如果沒有g标記,則隻有每行第一個比對的test被替換成mytest。  

$ sed -n 's/^test/mytest/p' filename-----(-n)選項和p标志一起使用表示隻輸出那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就輸出它。  

$ sed 's/^192.168.0.1/&localhost/' filename-----&符号表示替換換字元串中被找到的部份。所有以192.168.0.1開頭的行都會被替換成它自已加 localhost,變成192.168.0.1localhost。  

$ sed -n 's/\(love\)able/\1rs/p' filename-----love被标記為1,所有loveable會被替換成lovers,而且替換的行會被輸出出來。  

$ sed 's#10#100#g' filename-----不論什麼字元,緊跟着s指令的都被認為是新的分隔符,是以,“#”在這裡是分隔符,代替了預設的“/”分隔符。表示把所有10替換成100。  

標明行的範圍:逗号   

$ sed -n '/test/,/check/p' filename-----所有在模闆test和check所确定的範圍内的行都輸出  

$ sed -n '5,/^test/p' filename-----從第五行開始到第一個包含以test開始行之間的所有行  

$ sed '/test/,/check/s/$/sed test/' filename-----對于模闆test和west之間的行,每行的末尾用字元串sed test替換。  

多點編輯:e指令  

$ sed -e '1,5d' -e 's/test/check/' filename-----(-e)選項允許在同一行裡執行多條指令。如例子所示,第一條指令删除1至5行,第二條指令用check替換test。指令的執 行順序對結果有影響。如果兩個指令都是替換指令,那麼第一個替換指令将影響第二個替換指令的結果。  

$ sed --expression='s/test/check/' --expression='/love/d' filename-----一個比-e更好的指令是--expression。它能給sed表達式指派。  

從檔案讀入:r指令  

$ sed '/test/r file' filename-----file裡的内容被讀進來,顯示在與test比對的行後面,如果比對多行,則file的内容将顯示在所有比對行的下面。  

寫入檔案:w指令   

$ sed -n '/test/w file' filename-----在filename中所有包含test的行都被寫入file裡。  

追加指令:a指令  

$ sed '/^test/a\\--->this is a filename' filename<-----'this is a filename'被追加到以test開頭的行後面,sed要求指令a後面有一個反斜杠。  

插入:i指令  

$  sed '2i drink tea' filename -------在22行插入drink tea

sed -i 's/\.$/\!/g' regular_express.txt 利用 sed 将 regular_express.txt 内每一行結尾

sed提取日志

首先看一下日志的格式:

1016-12-17 09:25:55,606 [catalina-exec-74] INFO org.springframework.jdbc.datasource.JdbcTransactionObjectSupport  - JDBC 3.0 Savepoint class is available

1016-12-17 09:25:55,658 [catalina-exec-74] WARN org.hibernate.util.JDBCExceptionReporter  - SQL Error: 0, SQLState: null

1016-12-17 09:25:55,606 [catalina-exec-74] INFO org.springframework.jdbc.datasource.JdbcTransactionObjectSupport  - JDBC 3.0 Savepoint class is available1016-12-17 09:25:55,658 [catalina-exec-74] WARN org.hibernate.util.JDBCExceptionReporter  - SQL Error: 0, SQLState: null

根據日志格式,需要将12-17的09:25:55 和09:28:08 之間的日志截取出來。

使用sed指令如下:

sed -n ‘/2016-12-17 09:25:55/,/2016-12-17 09:28:08/p’ logfile

這樣可以精确地截取出來某個時間段的日志。

也可以用下面指令

sed -n ‘/2016-12-17 09:[0-9][0-9]:[0-9][0-9]/,/2016-12-17 16:[0-9][0-9]:[0-9][0-9]/p’  logfile 

本文轉自super李導51CTO部落格,原文連結: http://blog.51cto.com/superleedo/1887915,如需轉載請自行聯系原作者