网站搜索

了解如何使用 Awk 变量、数字表达式和赋值运算符 - 第 8 部分


Awk 命令系列越来越令人兴奋,我相信在前面的七个部分中,我们介绍了 Awk 的一些基础知识,您需要掌握这些基础知识才能在 Linux 中执行一些基本的文本或字符串过滤。

从这一部分开始,我们将深入探讨 Awk 的高级领域,以处理更复杂的文本或字符串过滤操作。因此,我们将介绍 Awk 功能,例如变量、数值表达式和赋值运算符。

这些概念与您之前在许多编程语言中可能遇到的概念(例如 shell、C、Python 等)并不完全不同,因此无需太担心这个主题,我们只是修改使用的常见思想这些提到的功能。

这可能是最容易理解的 Awk 命令部分之一,所以坐下来开始吧。

1.awk变量

在任何编程语言中,变量都是存储值的占位符,当您在程序文件中创建变量时,随着文件的执行,会在内存中创建一些空间来存储您为变量指定的值。

您可以像定义 shell 变量一样定义 Awk 变量,如下所示:

variable_name=value 

在上面的语法中:

  1. variable_name:是您为变量指定的名称
  2. 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 中,数字表达式是使用以下数字运算符构建的:

  1. *:乘法运算符
  2. +:加法运算符
  3. /:除法运算符
  4. -:减法运算符
  5. % :模运算符
  6. ^:指数运算符

数值表达式的语法是:

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 中有多个赋值运算符,其中包括:

  1. *= :乘法赋值运算符
  2. += :加法赋值运算符
  3. /= :除法赋值运算符
  4. -= :减法赋值运算符
  5. %= :模赋值运算符
  6. ^=:指数赋值运算符

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 功能,即特殊模式:BEGINEND。在此之前,请保持与 Howtoing 的连接。