sed&awk

個人理解,sed是匹配&替換,awk是匹配&過濾。這匹配的意思就是模式串的匹配,這替換就是堆匹配到的串進行替換操做,這過濾就是篩選出指定的字段出來。編輯器

手冊把sed稱爲stream editor,即流編輯器,重點是流。而awk則被稱爲pattern scanning and text processing language,即模式搜索與文本處理的語言,記住它是門語言。測試

awk

awk命令模式:code

awk 'pattern { action }' input

pattern字段是可選的,用於執行邏輯判斷。action字段必要的,用於操做,支持的內容就多了,能夠打印,根據參數做運算等等。默認是根據空格或\t來分列的。blog

測試輸入樣本:字符串

Beth    4.00    0
Dan 3.75    0
kathy   4.00    10
Mark    5.00    20
Mary    5.50    22
Susie   4.25    18

打印首列:get

awk '{print $1}'  input

支持數字(整型、浮點型之間相互)比較:input

awk '$3 <= 0 {print $1}'  input

支持字符串比較:cmd

awk '$1 == "Mary" {print $1}'  input

支持||&&:it

awk '$3 <= 0 || $3 >= 22 {print $1}'  input
awk '!($3 >= 0 && $3 < 22) {print $1}'  input

pattern字段支持運算:io

awk '$3 * $3 > 9 {print $1}'  input

以兩個/括起來的pattern支持正則:

awk '/Ma.k/ {print $1}'  input

支持邏輯取反符號:

awk '!/Ma.k/ {print $1}'  input

支持多個輸入文件:

awk '{print $1}'  input1 input2

支持從文件讀取命令:

awk  -f executefile  input

打印整行:

awk '{print $0}'  input
awk '{print}'  input

不清楚有多少列,打印最後一列:

awk '{print $NF}'  input

打印列數:

awk '{print NF}'  input

支持計算:

awk '{print  $2 * $2 * $3}'  input

,號會被輸出成空格,打印多列需用,分隔:

awk '{print  $2,$3}'  input

打印行號:

awk '{print  NR}'  input

插入常量字符串:

awk { print "total pay for", $1, "is", $2 * $3 } input

使用printf進行格式化輸出:

awk '{ printf("total pay for %s is %.2f\n", $1, $2 * $3) }'  input

改變分隔符(-F須放在前面):

awk -F ">"   '{print  $3}'  input
awk -F ","   '{print  $3}'  input

支持以[]:隔開多個分隔符(不能有空格,順序無關):

awk -F [",":"|"] '{print $3}' input

對某一列進行累加

awk '{sum += $2}END{print sum/107}'  input

sed

sed命令模式

sed  'pattern'  input

這個pattern沒有很直觀,都是以指令驅動的,指令能夠在前面(如s),也能夠在末尾(如p)。常見的需求就是增/刪/查/改,就是在匹配行的前/後n行插入新行,就是刪除匹配的行,其實能夠用grep替代,就是找出匹配的行進行修改(有上下文關係的,好比匹配多行就比較麻煩了)。

先來了解如何指定輸入的行號。

打印文件內容

sed -n 'p'  input

打印文件行號(行號是新起一行的)

sed -n '=;p'  input

只打印第2行

sed -n '2p'  input

打印2~4行

sed -n '2,4p'  input

從第4行開始輸出到結束

sed -n '2,$p'  input

打印2~4行且打印行號

sed -n '2,4{=;p}'  input

打印含有abc的行

sed -n '/abc/p'  input

打印1~4行中含有Mem的行

sed -n '/Mem/,{1,4p}'  input

打印除了1~4行的內容

sed -n '1,4!p'  input

打印匹配Mem至匹配Swap的行
···
sed -n '/Mem/,/Swap/p' input
···

簡單全局替換(不修改源文件,直接輸出到終端)

sed 's/str1/str2/g' input

全局替換(修改源文件)

sed -i 's/str1/str2/g' input

指定其餘分隔符,可避免頻繁輸出轉義符號(下例把/替換成|)

sed -i 's:/:|:g' input

從指定文件中執行命令

sed  -f cmd  input

只輸出匹配的行(-n搭配p,默認是全輸出)

sed -n '$p' input

優質文章:http://blog.jobbole.com/109088/#toc_1

相關文章
相關標籤/搜索