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,如需轉載請自行聯系原作者