awk和gawk命令
使用awk和gawk处理文件。使用awk轻松操作文件和文本字段。创建简单的awk脚本。
什么是awk?
awk是一种模式扫描处理语言,旨在处理诸如系统转储日志文件之类的文本文件。awk允许使用正则表达式和模式匹配,使其成为一种非常强大的语言。awk的名称来自其原始作者:Alfred V. Aho,Brian W. Kernighan和Peter J. Weinberger。Gawk是awk的(Gnu awk)实现。
像许多编程语言一样,awk可以处理变量,循环,条件处理和算术。
awk的基本示例
测试文件text.txt的内容
one two three four five six John 246810 team01 UK Birmingham FTE Paul 135790 team02 UK Glasgow FTE Marcus 049583 team03 DE Bremen PTE Foxy 903485 team01 UK Aston PTE
打印文件中的所有行和字段
awk读取文件或输入的每一行,并将每一行分成多个字段。默认情况下,空格(空格和制表符)用于分隔字段。然后,每个字段都存储在变量中。为了显示整行,我们使用变量$0,对于字段1我们将使用$1,字段2将是$2 ...
john@sles01:~/testing> awk '{ printjohn@sles01:~/testing> awk '{ print }' test.txt one John Paul Marcus Foxy}' test.txt one two three four five six John 246810 team01 UK Birmingham FTE Paul 135790 team02 UK Glasgow FTE Marcus 049583 team03 DE Bremen PTE Foxy 903485 team01 UK Aston PTE
显示第一列
john@sles01:~/testing> awk '{ print }' test.txt two 246810 135790 049583 903485
显示第二列
john@sles01:~/testing> awk '{ print , }' test.txt one three John team01 Paul team02 Marcus team03 Foxy team01
显示第一列和第三列
john@sles01:~/testing> awk '/team01/ { printjohn@sles01:~/testing> awk '/team01/ { print ,"-",,"-",}' test.txt John - 246810 - team01 Foxy - 903485 - team01}' test.txt John 246810 team01 UK Birmingham FTE Foxy 903485 team01 UK Aston PTE
只显示包含特定字符串的字段
以下示例仅打印包含字符串team01
的行:
john@sles01:~/testing> awk '/FTE$/ { print$awk </etc/passwd -F:'{print ,"-",,"-",}' john - /home/john - /bin/bash johnny - /home/johnny - /bin/bash oracle - /home/oracle - /bin/bash oralint - /home/oralint - /bin/bash lol - /home/lol - /bin/bash test - /home/test - /bin/bash testuser - /home/testuser - /bin/bash}' test.txt John 246810 team01 UK Birmingham FTE Paul 135790 team02 UK Glasgow FTE john@sles01:~/testing> awk '/PTE$/ { printjohn@sles01:~/testing> echo 10 2 | awk '{ print + }' 12 john@sles01:~/testing> echo 10 2 | awk '{ print - }' 8 john@sles01:~/testing> echo 10 2 | awk '{ print * }' 20 john@sles01:~/testing> echo 10 2 | awk '{ print / }' 5}' test.txt Marcus 049583 team03 DE Bremen PTE Foxy 903485 team01 UK Aston PTE
以下示例仅在包含字符串team01
的情况下才打印1-3列:
john@sles01:~/testing> awk 'BEGIN{ x=1; while(1) { print "Count = ",x; if ( x==10 ) break; x++; }}' Count = 1 Count = 2 Count = 3 Count = 4 Count = 5 Count = 6 Count = 7 Count = 8 Count = 9 Count = 10
以下示例仅打印包含指定字符串的行:
#!/usr/bin/awk -f # # Test awk script # BEGIN { print "--- I am a test awk file ---" count=0 } { if ( =="team01") { print "team01 members found: ","-", count=count+1 } } END { print "------------------------------" printf("\tTotal Number of Records Processed:\t%d\n", NR) printf("\tNumber of team01 members found :\t%d\n", count) } john@sles01:~/testing> ls -l awk01 -rwxr-xr-x 1 john users 416 May 28 15:02 awk01 john@sles01:~/testing> ./awk01 test.txt --- I am a test awk file --- team01 members found: John - team01 team01 members found: Foxy - team01 ------------------------------ Total Number of Records Processed: 5 Number of team01 members found : 2
awk字段分隔符
默认情况下,awk用空格分隔其输入行的字段。要修改此分隔符字段,可以使用-F
标志指定其他分隔符。
一个简单的例子就是执行命令:awk </etc/passwd -F:'{print $1,"-",$6,"-",$7}'
使用awk的基本算术
以下示例显示了非常基本的加法,减法,乘法和除法计算:
##代码##基本循环的例子
awk可以使用许多循环类型。一些常用的类型是while
、do while
和for
。一个简单的while循环例子如下:
awk脚本
每个awk程序都包含三个部分:一个BEGIN块,在读取任何输入之前执行一次;一个主循环,对输入的每一行执行一次;END块,在读取所有输入后执行。
awk脚本的简单示例:
##代码##在上面的示例脚本中,我们的BEGIN块将计数值设置为0count = 0
,接下来脚本的中间部分检查第三个字段$ 3的内容。如果此字段包含我们的搜索条件team01
,则我们将计数值加1。扫描完输入文件的每一行后,END块将打印出结果的简单摘要。变量计数包含匹配数,awk变量NR包含处理的记录数。