個人理解,sed是匹配&替換,awk是匹配&過濾。這匹配
的意思就是模式串的匹配,這替換
就是堆匹配到的串進行替換操做,這過濾
就是篩選出指定的字段出來。編輯器
手冊把sed稱爲stream editor,即流編輯器,重點是流。而awk則被稱爲pattern scanning and text processing language,即模式搜索與文本處理的語言,記住它是門語言。測試
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 '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