首先咱们要知道,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/