簡單使用:
awk :對于文件中一行行的獨處來執行操作 。
awk -F :'{print $1,$4}' :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。
?
?
詳細介紹:
AWK命令介紹
?
awk語言的最基本功能是在文件或字符串中基于指定規則瀏覽和抽取信息,awk抽取信息后,才能進行其他文本操作,完整的awk腳本通常用來格式化文本文件中的信息
?
1. 調用awk:
?
第一種命令行方式,如:
?
awk[-Field-separator]'commands'input-file(s)
?
這里commands是真正的awk命令,[-F域分隔符]是可選的,awk默認使用空格分隔,因此如果要瀏覽域間有空格的文本,不必指定這個選項,但如果瀏覽如passwd文件,此文件各域使用冒號作為分隔符,則必須使用-F選項: awk -F : 'commands' input-file
?
第二種,將所有awk命令插入一個文件,并使awk程序可執行,然后用awk命令解釋器作為腳本的首行,以便通過鍵入腳本名稱來調用它
?
第三種,將所有awk命令插入一個單獨文件,然后調用,如:
?
awk-fawk-script-fileinput-file
?
-f選項指明在文件awk-script-file的awk腳本,input-file是使用awk進行瀏覽的文件名
?
2. awk腳本:
?
awk腳本由各種操作和模式組成,根據分隔符(-F選項),默認為空格,讀取的內容依次放置到對應的域中,一行一行記錄讀取,直到文件尾
?
2.1. 模式和動作
?
任何awk語句都是由模式和動作組成,在一個awk腳本中可能有許多語句。模式部分決定動作語句何時觸發及觸發事件。動作即對數據進行的操作,如果省去模式部分,動作將時刻保持執行狀態
?
模式可以是任何條件語句或復合語句或正則表達式,模式包含兩個特殊字段BEGIN和END,使用BEGIN語句設置計數和打印頭,BEGIN語句使用在任何文本瀏覽動作之前,之后文本瀏覽動作依據輸入文件開始執行;END語句用來在awk完成文本瀏覽動作后打印輸出文本總數和結尾狀態標志,有動作必須使用{}括起來
?
實際動作在大括號{}內指明,常用來做打印動作,但是還有更長的代碼如if和循環looping語句及循環退出等,如果不指明采取什么動作,awk默認打印出所有瀏覽出的記錄
?
2.2. 域和記錄:
?
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
?
同時打印信息頭和信息尾
?
2.3. 條件操作符:
?
<、<=、==、!=、>=、~匹配正則表達式、!~不匹配正則表達式
?
匹配: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
?
2.4. awk內置變量:
?
ARGC | 命令行參數個數 | NF | 瀏覽記錄的域個數 |
AGRV | 命令行參數排列 | NR | 已讀的記錄數 |
ENVIRON | 支持隊列中系統環境變量的使用 | OFS | 輸出域分隔符 |
FILENAME | awk瀏覽的文件名 | ORS | 輸出記錄分隔符 |
FNR | 瀏覽文件的記錄數 | RS | 控制記錄分隔符 |
FS | 設置輸入域分隔符,同- F選項 | NF | 瀏覽記錄的域個數 |
?
例: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}' 顯示當前目錄名