在前面的内容中,小编介绍了一些关于Awk命令的基础知识,以便大家能够在Linux系统中执行基本的文本或字符串过滤。
在本文内容中,小编主要介绍Awk部分高级功能,其中主要包括变量、数字表达式和赋值运算符的应用示例,以处理更复杂的文本或字符串过滤操作。
这些概念可能与大家之前在许多编程语言中遇到的概念(例如Shell、C/C+、Python等)并没有太大区别。因此,无需过多担心会不会用的问题,这里只是复习这些功能的常见用法,它可能是最容易理解的Awk命令部分之一。
1、Awk变量
在任何编程语言中,变量都是存储值的占位符。当你在程序文件中创建变量时,在执行文件时,会在内存中创建一些空间来存储你为变量指定的值。
实际上,你可以按照定义shell变量的方式来定义Awk变量,具体如下所示:
variable_name=value
在上面的语法中:
variable_name
:是你赋予变量的名称value
:变量中存储的值
接下来看看下面的一些例子:
computer_name=”ecscoupon.com” port_no=”22” email=”admin@ecscoupon.com” server=”computer_name”
可以看到,在第一个变量定义中,ecscoupon.com
将值分配给变量computer_name
。
此外,将值22
分配给变量port_no
,也可以将一个变量的值分配给另一个变量,如上所示,这里将computer_name
的值分配给变量server
。
如果你还记得的话,在Awk打印字段和列部分,小编介绍了Awk如何将输入行划分为字段,并使用标准字段访问运算符$
来读取已解析的不同字段。其实,我们还可以使用变量来存储字段的值。
first_name=$2 second_name=$3
在上面的例子中,first_name
的值被设置为第二个字段,second_name
被设置为第三个字段。
举例来说,考虑一个名为names.txt的文件,其中包含用户列表,其中列有用户的名字、姓氏和性别。使用cat命令可以查看文件的内容,如下所示:
cat names.txt
在这里,我们还可以使用变量first_name
和second_name
来存储列表中第一个用户的名字和姓氏,就像运行下面的Awk命令一样:
awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt
另外,再看看另一种情况,当你在终端上发出uname -a
命令时,它会打印出你的所有系统信息。
第二个字段包含你的主机名(hostname),因此可以将主机名存储在名为hostname
的变量中,并使用Awk打印它,如下所示:
uname -a uname -a | awk '{hostname=$2 ; print hostname ; }'
2、数字表达式
在Awk中,使用以下数字运算符构建数字表达式:
*
:乘法运算符+
:加法运算符/
:除法运算符-
:减法运算符%
:模数运算符^
:指数运算符
数字表达式的语法是:
operand1 operator operand2
在上述形式中,operand1
和operand2
可以是数字或变量名,而operator
可以是上述任意运算符。
下面是一些示例来说明如何构建数值表达式:
counter=0 num1=5 num2=10 num3=num2-num1 counter=counter+1
为了理解Awk中数字表达式的用法,将考虑下面的例子,其中包含 domains.txt
文件,该文件列出了Ecscoupon拥有的所有域名。
news.ecscoupon.com ecscoupon.com ecscoupon.com windows.ecscoupon.com ecscoupon.com linux.ecscoupon.com ecscoupon.com news.ecscoupon.com
要查看文件的内容,请使用以下命令:
cat domains.txt
如果想要计算ecscoupon.com
域名在文件中出现的次数,可以编写一个简单的脚本来执行此操作,如下所示:
#!/bin/bash for file in $@; do if [ -f $file ] ; then #print out filename echo "File is: $file" #print a number incrementally for every line containing ecscoupon.com awk '/^ecscoupon.com/ { counter=counter+1 ; printf "%s\n", counter ; }' $file else #print error info incase input is not a file echo "$file is not a file, please specify a file." >&2 && exit 1 fi done #terminate script with exit code 0 in case of successful execution exit 0
创建脚本后,保存并使其可执行,当使用domains.txt
文件作为输入运行它时,会得到以下输出:
./script.sh ~/domains.txt
从脚本的输出来看,domains.txt
文件中有4行包含ecscoupon
,你也可以手动计算确认结果是否正确。
3、赋值运算符
这里将介绍的最后一个Awk功能是赋值运算符,Awk中有多个赋值运算符,主要包括:
*=
:乘法赋值运算符+=
:加法赋值运算符/=
:除法赋值运算符-=
:减法赋值运算符%=
:模数赋值运算符^=
:指数赋值运算符
Awk中赋值操作的最简单语法如下:
variable_name=variable_name operator operand
例子:
counter=0 counter=counter+1 num=20 num=num-1
你可以使用上面的赋值运算符来缩短Awk中的赋值操作,考虑前面的例子,则可以按照以下形式执行赋值:
variable_name operator=operand
counter=0 counter+=1 num=20 num-=1
因此,我们可以使用赋值运算符+=
更改上面刚刚编写的shell脚本中的Awk命令,如下所示:
#!/bin/bash for file in $@; do if [ -f $file ] ; then #print out filename echo "File is: $file" #print a number incrementally for every line containing ecscoupon.com awk '/^ecscoupon.com/ { counter+=1 ; printf "%s\n", counter ; }' $file else #print error info incase input is not a file echo "$file is not a file, please specify a file." >&2 && exit 1 fi done #terminate script with exit code 0 in case of successful execution exit 0
小结
在本部分Awk命令系列中,主要介绍了一些强大的Awk功能,即变量、构建数字表达式和使用赋值运算符,以及一些有关如何实际使用它们的说明。这些概念与其它编程语言中的概念没有什么不同,但在Awk编程下可能会存在一些显著区别,所以务必要注意。