收集云服务器优惠信息
记录云服务器使用心得

Linux系统中使用Awk变量、表达式和运算符示例详解

在前面的内容中,小编介绍了一些关于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

使用cat命令列出文件内容

在这里,我们还可以使用变量first_namesecond_name来存储列表中第一个用户的名字和姓氏,就像运行下面的Awk命令一样:

awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt

使用Awk命令存储变量

另外,再看看另一种情况,当你在终端上发出uname -a命令时,它会打印出你的所有系统信息。

第二个字段包含你的主机名(hostname),因此可以将主机名存储在名为hostname的变量中,并使用Awk打印它,如下所示:

uname -a
uname -a | awk '{hostname=$2 ; print hostname ; }'

使用Awk将命令输出存储到变量

2、数字表达式

在Awk中,使用以下数字运算符构建数字表达式:

  • *:乘法运算符
  • +:加法运算符
  • /:除法运算符
  • -:减法运算符
  • %:模数运算符
  • ^:指数运算符

数字表达式的语法是:

operand1 operator operand2

在上述形式中,operand1operand2可以是数字或变量名,而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编程下可能会存在一些显著区别,所以务必要注意。

赞(0)
网站声明:本文内容由趣云笔记原创,部分资源收集于网络,如有侵权请联系企鹅:2472781824删除。
文章名称:《Linux系统中使用Awk变量、表达式和运算符示例详解》
文章链接:https://www.ecscoupon.com/9075.html
本站资源仅供个人学习交流,未经允许不得转载,更不允许用于商业用途。如需转载,请注明来源,感谢理解!