使用 Awk 变量、表达式和运算符
Awk 命令系列变得令人兴奋!我相信,在前面的七个部分中,我们已经介绍了您需要掌握的一些 Awk 基础知识,以便您能够在 Linux 中执行基本的文本或字符串过滤。
从这一部分开始,我们将深入探讨 Awk 的高级领域,以处理更复杂的文本或字符串过滤操作。因此,我们将介绍 Awk 功能,例如变量、数字表达式和赋值运算符。
这些概念与您之前在许多编程语言(例如 Shell、C、Python 等)中遇到的概念没有显着差异。所以,大家不必太担心这个话题;我们只是修改使用这些功能的常见想法。
这可能是最容易理解的 Awk 命令部分之一,所以坐下来,让我们开始吧
1.awk变量
在任何编程语言中,变量都是存储值的占位符。当您在程序文件中创建变量时,在执行该文件时,会在内存中创建一些空间,用于存储您为该变量指定的值。
您可以像定义 shell 变量一样定义 Awk 变量,如下所示:
variable_name=value
在上面的语法中:
variable_name
:是您为变量指定的名称。value
:存储在变量中的值。
让我们看下面的一些例子:
computer_name=”linux-console.net”
port_no=”22”
email=”[email ”
server=”computer_name”
看一下上面的简单示例,在第一个变量定义中,值 howtoing.com
被分配给变量 computer_name
。
此外,值22
被分配给变量port_no
,也可以将一个变量的值分配给另一个变量,就像我们分配值的上一个例子一样computer_name
到变量服务器。
如果您还记得,在本 Awk 系列的第 2 部分中,我们讨论了字段编辑,我们讨论了 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
的变量中,并使用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
包含 Howtoing 拥有的所有域。强>。
news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net
要查看文件的内容,请使用以下命令:
cat domains.txt
如果我们想要计算域 howtoing.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 linux-console.net
awk '/^linux-console.net/ { 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
中有 6 行包含 howtoing.com
,以确认您可以手动计算它们。
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 linux-console.net
awk '/^linux-console.net/ { 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 编程中可能存在一些显着的区别。
在第 9 部分中,我们将了解更多属于特殊模式的 Awk 功能:BEGIN 和 END。在此之前,请保持与 Howtoing 的连接。
对于那些寻求全面资源的人,我们将所有 Awk 系列文章整理成一本书,包括 13 章、41 页,涵盖了 Awk 的基础和高级用法以及实际示例。
Product Name | Price | Buy |
---|---|---|
eBook: Introducing the Awk Getting Started Guide for Beginners | $8.99 | [Buy Now] |