簡單介紹一下,awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大,這是我們玩linux的必備基本功,若要對其身世有更詳盡的了解,自行搜索即可。對於工具的知識,筆者盡量將每個知識點的簡要說明,並給出實例。
簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。
用法:
awk [options] 'scripts' file1,file2...
awk [options] 'pattern {action}' file1,file2...
options是awk的支持的選項,譬如-F -v等; scripts是其處理腳本,包含模式pattern和動作action(模式和動作的關系一般為,模式負責確定有效字段,動作負責對其處理)
一、print的簡單使用
創建一個簡單的測試文件如下:
- [root@mos download]# cat demo.txt
- Welcome to mos blog.
- This is a test file.
例:打印整行: $0
- [root@mos download]# awk '{print $0}' demo.txt
- Welcome to mos blog.
- This is a test file.
例:打印每行的最後一個字段: $NF
- [root@mos download]# awk '{print $NF}' demo.txt
- blog.
- file.
例:打印第二個字段: $2
- [root@mos download]# awk '{print $2}' demo.txt
- to
- is
例:打印每行的倒數第二個字段,並在其後打印OK
- [root@mos download]# awk '{print $(NF-1),"OK"}' demo.txt
- mos OK
- test OK
例:打印行號
- [root@mos download]# awk '{print NR,$0}' demo.txt
- 1 Welcome to mos blog.
- 2 This is a test file.
例:打印當前系統環境變量的某個特定值,譬如路徑,下面倆輸出一樣
- [root@mos download]# awk '{print ENVIRON["USER"];}' demo.txt
- root
- root
- [root@mos download]# awk 'BEGIN{print ENVIRON["PATH"];}'
- /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/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@mos 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.txt
- WelcomeXXXXblog.
- ThisXXXXfile.
- PS: 若在print輸出字段的之間不寫逗號,則輸出分隔符無效,輸出的結果會直接連在一起
awk中有許多默認的變量,例如之前列出的:$1~$n、$0、FS、OFS等。下圖為awk內置變量表:
- 屬性 說明
- $0 當前記錄(作為單個變量)
- $1~$n 當前記錄的第n個字段,字段間由FS分隔
- FS 輸入字段分隔符 默認是空格
- NF 當前記錄中的字段個數,就是有多少列
- NR 已經讀出的記錄數,就是行號,從1開始
- RS 輸入的記錄他隔符默 認為換行符
- OFS 輸出字段分隔符 默認也是空格
- ORS 輸出的記錄分隔符,默認為換行符
- ARGC 命令行參數個數
- ARGV 命令行參數數組
- FILENAME 當前輸入文件的名字
- IGNORECASE 如果為真,則進行忽略大小寫的匹配
- ARGIND 當前被處理文件的ARGV標志符
- CONVFMT 數字轉換格式 %.6g
- ENVIRON UNIX環境變量
- ERRNO UNIX系統錯誤消息
- FIELDWIDTHS 輸入字段寬度的空白分隔字符串
- FNR 當前記錄數
- OFMT 數字的輸出格式 %.6g
- RSTART 被匹配函數匹配的字符串首
- RLENGTH 被匹配函數匹配的字符串長度
- SUBSEP \034
- 聲明一下:由於許多變量筆者亦不怎麼常用,因此筆者此處未全部列出。