歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux awk命令使用詳解

Linux awk命令使用詳解

日期:2017/2/28 14:54:28   编辑:Linux教程

簡單介紹一下,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的簡單使用

創建一個簡單的測試文件如下:

  1. [root@mos download]# cat demo.txt
  2. Welcome to mos blog.
  3. This is a test file.


例:打印整行: $0

  1. [root@mos download]# awk '{print $0}' demo.txt
  2. Welcome to mos blog.
  3. This is a test file.

例:打印每行的最後一個字段: $NF

  1. [root@mos download]# awk '{print $NF}' demo.txt
  2. blog.
  3. file.

例:打印第二個字段: $2

  1. [root@mos download]# awk '{print $2}' demo.txt
  2. to
  3. is

例:打印每行的倒數第二個字段,並在其後打印OK

  1. [root@mos download]# awk '{print $(NF-1),"OK"}' demo.txt
  2. mos OK
  3. test OK

例:打印行號

  1. [root@mos download]# awk '{print NR,$0}' demo.txt
  2. 1 Welcome to mos blog.
  3. 2 This is a test file.

例:打印當前系統環境變量的某個特定值,譬如路徑,下面倆輸出一樣

  1. [root@mos download]# awk '{print ENVIRON["USER"];}' demo.txt
  2. root
  3. root
  4. [root@mos download]# awk 'BEGIN{print ENVIRON["PATH"];}'
  5. /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  6. PS:後面的文件只是為了讓print成功執行,BEGIN是執行前可以輸出的數據,常用作寫為報告標題和測試輸出,其內容不能獲得與文件修改操作有關的變量,後面會說到;

例:awk的默認分隔符為空格,而有些文本字以其他字符為分隔符,以下兩例相同

  1. [root@mos download]# awk -F: {'print $1,$NF'} /etc/passwd|tail -1
  2. mos1 /bin/bash
  3. [root@mos download]# awk -v FS=: '{print $1,$NF}' /etc/passwd|head -1
  4. root /bin/bash

例:修改輸出分隔符號,特殊字符需轉義,如下幾例:

  1. [root@mos download]# awk -v OFS=. '{print $1,$NF}' demo.txt
  2. Welcome.blog.
  3. This.file.
  4. [root@mos download]# awk -v OFS="~"'{print $1,$NF}' demo.txt
  5. Welcome~blog.
  6. This~file.
  7. [root@mos download]# awk -v OFS=\" '{print $1,$NF}' demo.txt
  8. Welcome"blog.
  9. This"file.
  10. [root@mos download]# awk -v OFS=9 '{print $1,$NF}' demo.txt
  11. Welcome9blog.
  12. This9file.
  13. [root@mos download]# awk -v OFS=XXXX '{print $1,$NF}' demo.txt
  14. WelcomeXXXXblog.
  15. ThisXXXXfile.
  16. PS: 若在print輸出字段的之間不寫逗號,則輸出分隔符無效,輸出的結果會直接連在一起

awk中有許多默認的變量,例如之前列出的:$1~$n、$0、FS、OFS等。下圖為awk內置變量表:

  1. 屬性 說明
  2. $0 當前記錄(作為單個變量)
  3. $1~$n 當前記錄的第n個字段,字段間由FS分隔
  4. FS 輸入字段分隔符 默認是空格
  5. NF 當前記錄中的字段個數,就是有多少列
  6. NR 已經讀出的記錄數,就是行號,從1開始
  7. RS 輸入的記錄他隔符默 認為換行符
  8. OFS 輸出字段分隔符 默認也是空格
  9. ORS 輸出的記錄分隔符,默認為換行符
  10. ARGC 命令行參數個數
  11. ARGV 命令行參數數組
  12. FILENAME 當前輸入文件的名字
  13. IGNORECASE 如果為真,則進行忽略大小寫的匹配
  14. ARGIND 當前被處理文件的ARGV標志符
  15. CONVFMT 數字轉換格式 %.6g
  16. ENVIRON UNIX環境變量
  17. ERRNO UNIX系統錯誤消息
  18. FIELDWIDTHS 輸入字段寬度的空白分隔字符串
  19. FNR 當前記錄數
  20. OFMT 數字的輸出格式 %.6g
  21. RSTART 被匹配函數匹配的字符串首
  22. RLENGTH 被匹配函數匹配的字符串長度
  23. SUBSEP \034
  24. 聲明一下:由於許多變量筆者亦不怎麼常用,因此筆者此處未全部列出。
Copyright © Linux教程網 All Rights Reserved