sed 應用

weixin_33935777發表於2018-05-02

awk '{print $1,$4}' test.txt  檢視第一列和第四列

awk '{printf "%-8s %-10s %-20s %-15s\n",$1,$3,$5,$6}'  test   檢視1  3  5 6 列 並列印出間距格式(格式化輸出)

過濾記錄:awk '$3==0 && $6=="LISTEN"'   test

選出第3列值為0並且第6列值為"LISTEN"

awk '$3>0 {print $0}' test   第3列值大於0的,$0---整行

awk '$3==0 && $6=="LISTEN"  || NR==1'   test      NR表頭==1  第一行

'$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' test    加格式化輸出

說到了內建變數,我們可以來看看awk的一些內建變數:

$0當前記錄(這個變數中存放著整個行的內容)

$1~$n當前記錄的第n個欄位,欄位間由FS分隔

FS輸入欄位分隔符 預設是空格或Tab

NF當前記錄中的欄位個數,就是有多少列

NR已經讀出的記錄數,就是行號,從1開始,如果有多個檔案話,這個值也是不斷累加中。

FNR當前記錄數,與NR不同的是,這個值會是各個檔案自己的行號

RS輸入的記錄分隔符, 預設為換行符

OFS輸出欄位分隔符, 預設也是空格

ORS輸出的記錄分隔符,預設為換行符

FILENAME當前輸入檔案的名字

指定分隔符: awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd   =root    0       /root

bin     1       /bin

daemon  2       /sbin

adm     3       /var/adm

lp      4       /var/spool/lpd

sync 5       /sbin

root 0 /root

bin 1 /bin

daemon 2 /sbin

adm 3 /var/adm

lp 4 /var/spool/lpd

sync 5 /sbin

shutdown 6 /sbin

halt 7 /sbin

awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd

root    0       /root

bin     1       /bin

daemon  2       /sbin

adm     3       /var/adm

lp      4       /var/spool/lpd

sync 5       /sbin

awk -F '[;:]'  如果你要指定多個分隔符,你可以這樣來:

awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt

第6列中帶有“FIN”的列,加首列原本行號,排列格式

awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt

上面的第一個示例匹配FIN狀態, 第二個示例匹配WAIT字樣的狀態。其實 ~ 表示模式開始。/ /中是模式。這就是一個正規表示式的匹配。

我們可以使用 “/FIN|TIME/” 來匹配 FIN 或者 TIME :

awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt

再來看看模式取反的例子: awk '$6 !~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt