awk和gawk命令

时间:2019-04-29 03:17:28  来源:igfitidea点击:

使用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 '{ print 
john@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/ { print 
john@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$/ { print
john@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可以使用许多循环类型。一些常用的类型是whiledo whilefor。一个简单的while循环例子如下:

##代码##

awk脚本

每个awk程序都包含三个部分:一个BEGIN块,在读取任何输入之前执行一次;一个主循环,对输入的每一行执行一次;END块,在读取所有输入后执行。

awk脚本的简单示例:

##代码##

在上面的示例脚本中,我们的BEGIN块将计数值设置为0count = 0,接下来脚本的中间部分检查第三个字段$ 3的内容。如果此字段包含我们的搜索条件team01,则我们将计数值加1。扫描完输入文件的每一行后,END块将打印出结果的简单摘要。变量计数包含匹配数,awk变量NR包含处理的记录数。