簡單介紹一下,awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大,這是我們玩linux的必備基本功,若要對其身世有更詳盡的了解,請自行搜尋即可。對於工具的知識,筆者盡量將每個知識點的簡要說明,並給予實例。
簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符號將每行切片,切開的部分再進行各種分析處理。
用法:
awk [options] 'scripts' file1,file2...
awk [options] 'pattern {action}' file1,file2...
options是awk的支援的選項,譬如-等等; scripts是其處理腳本,包含模式pattern和動作action(模式和動作的關係一般為,模式負責確定有效字段,動作負責對其處理)
一、print的簡單使用
創建一個簡單的測試檔如下:
[root@mos download]# cat demo.txt
Welcome to mos blog.
This is a test file.
load#a 例:列印整行awk '{print $0}' demo.txt
[root@mos root
root
[root@mos download]# awk 'BEGIN{print ENVIRON["PATH"];}'
/usr/kerusr/kerberos/bin/ker /sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PS:後面的檔案只是為了讓print成功執行,BEGIN是執行前可以輸出的數據,常用作寫為報告標題和測試輸出,其內容不能獲得與文件修改操作有關的變量,後面會說到;
例:awk的默認分隔符為空格,而有些文本字以其他字符為分隔符,以下兩例相同
[root@mos download]# awk -F: {'print $1,$NF'} /etc/passwd|tail -1
mos1 /bin/bash
[root@mos download]# awk -v FS=: '{print $1,$NF}' /etc/passwd|head -1
root /bin/bash
例:修改輸出分隔符號,特殊字元需轉義,如下幾範例:
[root@mos download]# awk -v OFS=. '{print $1,$NF}' demo.txt
Welcome.blog.
This.file.
[root@root download] awk -v OFS="~"'{print $1,$NF}' demo.txt
Welcome~blog.
This~file.
[root@mos download]# awk -v OFS=" '{print $1,$NF}' demo.txt
Welcome"blog.
This"file.
[root@mos download]# awk -v OFS=9 '{print $1,$NF}' demo.txt Welcome9blog.
This9file.
[root@mos download]# awk -v OFS=XXXX '{print $1,$NF}' demo.his
WelcomeXXXPSblog。的之間不寫逗號,則輸出分隔符號無效,輸出的結果會直接連在一起
awk中有許多預設的變量,例如之前列出的:$1~$n、$0、FS、OFS等。下圖為awk內建變數表:
屬性說明
$0 目前記錄(作為單一變數)
$1~$n 目前記錄的第n個字段,字段間由FS分隔
FS 輸入字段分隔符號預設是空格
NF 目前記錄中的字段數,就是有多少列
NR 已經讀出的記錄數,就是行號,從1開始
RS 輸入的記錄他隔符默認為換行符
OFS 輸出欄位分隔符號預設也是空格
ORS 輸出的記錄分隔符,預設為換行符
ARGC 命令列參數個數
ARGV 命令列參數陣列
FILENAME 目前輸入檔案的名稱
進行忽略大小寫的匹配ARGIND 當前被處理文件的ARGV標誌符CONVFMT 數字轉換格式%.6gENVIRON UNIX環境變量ERRNO UNIX系統錯誤消息FIELDWIDTHS 輸入字段寬度的空白分隔字符串FNR 目前記錄數OFMT 數字的輸出格式%.6gRSTART 被匹配函數匹配的字串首RLENGTH 被匹配函數匹配的字串長度SUBSEP聲明一下:由於許多變數筆者亦不怎麼常用,因此筆者此處未全部列出。
更多Linux awk指令使用詳解相關文章請追蹤PHP中文網!