网站搜索

使用 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_namesecond_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

在上面的形式中,operand1operand2可以是数字或变量名,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]