首先咱們要知道,awk 可以自動將輸入的行,分隔爲若干字段。每個字段就是一組字符,它們和其餘的字段由一個內部字段分隔符分隔開來。linux
若是你熟悉 Unix/Linux 或者懂得 bash shell 編程,那麼你應該知道什麼是內部字段分隔符(IFS)變量。awk 中默認的 IFS 是製表符和空格。shell
awk 中的字段分隔符的工做原理以下:當讀到一行輸入時,將它按照指定的 IFS 分割爲不一樣字段,第一組字符就是字段一,能夠經過 $1 來訪問,第二組字符就是字段二,能夠經過 $2 來訪問,第三組字符就是字段三,能夠經過 $3 來訪問,以此類推,直到最後一組字符。編程
爲了更好地理解 awk 的字段編輯,讓咱們看一個下面的例子:bash
例 1:我建立了一個名爲 tecmintinfo.txt 的文本文件。函數
# vi tecmintinfo.txt # cat tecmintinfo.txt
在 Linux 上建立一個文件命令行
而後在命令行中,我試着使用下面的命令從文本 tecmintinfo.txt 中輸出第一個,第二個,以及第三個字段。教程
$ awk '//{print $1 $2 $3 }' tecmintinfo.txt TecMint.comisthe
從上面的輸出中你能夠看到,前三個字段的字符是以空格爲分隔符輸出的:ip
若是你注意觀察輸出的話能夠發現,輸出的字段值並無被分隔開,這是 print 函數默認的行爲。字符串
爲了使輸出看得更清楚,輸出的字段值之間使用空格分開,你須要添加 (,) 操做符。get
$ awk '//{print $1, $2, $3; }' tecmintinfo.txt TecMint.com is the
須要記住並且很是重要的是,($) 在 awk 和在 shell 腳本中的使用是大相徑庭的!
在 shell 腳本中,($) 被用來獲取變量的值。而在 awk 中,($) 只有在獲取字段的值時纔會用到,不能用於獲取變量的值。
例 2:讓咱們再看一個例子,用到了一個名爲 my_shoping.list 的包含多行的文件。
No Item_Name Unit_Price Quantity Price 1 Mouse #20,000 1 #20,000 2 Monitor #500,000 1 #500,000 3 RAM_Chips #150,000 2 #300,000 4 Ethernet_Cables #30,000 4 #120,000
若是你只想輸出購物清單上每個物品的單價,你只需運行下面的命令:
$ awk '//{print $2, $3 }' my_shopping.txt Item_Name Unit_Price Mouse #20,000 Monitor #500,000 RAM_Chips #150,000 Ethernet_Cables #30,000
能夠看到上面的輸出不夠清晰,awk 還有一個 printf 的命令,能夠幫助你將輸出格式化。
使用 printf 來格式化 Item_Name 和 Unit_Price 的輸出:
$ awk '//{printf "%-10s %s/n",$2, $3 }' my_shopping.txt Item_Name Unit_Price Mouse #20,000 Monitor #500,000 RAM_Chips #150,000 Ethernet_Cables #30,000
總結
使用 awk 過濾文本或字符串時,字段編輯的功能是很是重要的。它可以幫助你從一個表的數據中獲得特定的列。必定要記住的是,awk 中 ($) 操做符的用法與其在 shell 腳本中的用法是不一樣的!
免費提供最新Linux技術教程書籍,爲開源技術愛好者努力作得更多更好:http://www.linuxprobe.com/