AWK命令使用 小結
awk 最基本功能是在檔案或字串中基於指定規則瀏覽和抽取資訊,它用於一行中分成數個“欄位”來處理。適合處理 小型資料。
範例:
cat /etc/passwd | awk '{FS=":"}$3 < 10 {print $1 "\t" $3}' 解釋:檔案/etc/passwd是以":"分隔的,檢視 第三欄 小於10的資料,並且只顯示 帳號 與 第三欄;
執行方式,如:
awk [-Field-separator] 'commands' input-file(s)
這裡commands是真正的awk命令,[-F域分隔符]是可選的,awk預設使用空格分隔,因此如果要瀏覽域間有空格的文字,不必指定這個選項,但如果瀏覽如passwd檔案,此檔案各域使用冒號作為分隔符,則必須使用-F選項: awk -F : 'commands' input-file
awk執行時,其瀏覽標記為$1,$2...$n,這種方法稱為域標記。使用$1,$3表示參照第1和第3域,注意這裡使用逗號分隔域,使用$0表示使用所有域。例如:
awk '{print $0}' temp.txt > sav.txt
表示列印所有域並把結果重定向到sav.txt中
awk '{print $0}' temp.txt | tee sav.txt
和上例相似,不同的是將在螢幕上顯示出來
awk '{print $1,$4}' temp.txt
只打印出第1和第4域
awk 'BEGIN {print "NAME GRADE\n----"} {print $1"\t"$4}' temp.txt
表示打資訊頭,即輸入的內容的第一行前加上"NAME GRADE\n-------------",同時內容以tab分開
awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp
同時列印資訊頭和資訊尾
條件操作符:
<、<=、==、!=、>=、~匹配正則表示式、!~不匹配正則表示式
匹配:awk '{if ($4~/ASIMA/) print $0}' temp 表示如果第四個域包含ASIMA,就列印整條
精確匹配:awk '$3=="48" {print $0}' temp 只打印第3域等於"48"的記錄
不匹配: awk '$0 !~ /ASIMA/' temp 列印整條不包含ASIMA的記錄
不等於: awk '$1 != "asima"' temp
小於: awk '{if ($1<$2) print $1 "is smaller"}' temp
設定大小寫: awk '/[Gg]reen/' temp 列印整條包含Green,或者green的記錄
任意字元: awk '$1 ~/^...a/' temp 列印第1域中第四個字元是a的記錄,符號’^’代表行首,符合’.’代表任意字元
或關係匹配: awk '$0~/(abc)|(efg)/' temp 使用|時,語句需要括起來
AND與關係: awk '{if ( $1=="a" && $2=="b" ) print $0}' temp
OR或關係: awk '{if ($1=="a" || $1=="b") print $0}' temp
awk內建變數:
ARGC |
命令列引數個數 |
NF |
瀏覽記錄的域個數 |
AGRV |
命令列引數排列 |
NR |
已讀的記錄數 |
ENVIRON |
支援佇列中系統環境變數的使用 |
OFS |
輸出域分隔符 |
FILENAME |
awk瀏覽的檔名 |
ORS |
輸出記錄分隔符 |
FNR |
瀏覽檔案的記錄數 |
RS |
控制記錄分隔符 |
FS |
設定輸入域分隔符,同- F選項 |
例: awk 'END {print NR}' temp 在最後列印已讀記錄條數
awk '{print NF,NR,$0} END {print FILENAME}' temp
awk '{if (NR>0 && $4~/Brown/) print $0}' temp 至少存在一條記錄且包含Brown
NF的另一用法: echo $PWD | awk -F/ '{print $NF}' 顯示當前目錄名
執行模式:awk '條件型別1{動作1} 條件型別2{動作2} ...' filename
# last | awk '{print $1 "\t" $3}' <== 檢視登入者的資料,只顯示登入名和ip地址,並以[tab]隔開awk 的內建變數變數名稱 代表的含義
NF 每一行($0)擁有的欄位總數
NR 當前 awk 所處理的是 “第幾行” 資料
FS 指定分隔符,預設一個空格鍵