百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Linux|Awk 变量、数字表达式和赋值运算符

ahcoder 2025-04-09 13:42 6 浏览

引言

本部分[1]将深入学习 Awk 的高级应用,以应对更为复杂的文本或字符串过滤任务。将介绍包括变量、数值表达式和赋值运算符在内的 Awk 功能。

这些概念与你之前可能在诸如shell、C、Python等许多编程语言中接触过的概念并没有本质上的不同,所以你不必过于担心这个主题,只是在回顾这些特性的通用用法。

这很可能是理解起来最不费力的Awk命令部分之一,那就让轻松地开始学习吧。

变量

在各种编程语言里,变量充当存储特定值的容器。一旦你在程序文件中声明了一个变量,程序执行时,就会在内存中分配一块空间来保存你为这个变量指定的值。

定义Awk变量的方法与定义shell变量的方法相同,具体如下:

variable_name=value 

在上述的语法规则中:

variable_name:指的是你为变量指定的名称

value:指的是变量存储的具体数值

接下来,让看一些具体的例子:

computer_name=”tecmint.com”
port_no=”22”
email=”admin@tecmint.com”
server=”computer_name”

观察上述的简单实例,在首次定义变量时,将值 tecmint.com 分配给了变量 computer_name。

同样,数字 22 被赋予了变量 port_no,还可以把一个变量的值赋给另一个变量,就像最后一个例子中,将变量 computer_name 的值赋给了变量 server。

如果你还记得,在本系列的第二部分,讨论了字段编辑,当时讨论了 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 ; }' 

数字表达式

在 Awk 语言中,可以通过使用一系列的数值运算符来构建数值表达式,这些运算符包括:

  • 表示乘法
  • 表示加法 / 表示除法
  • 表示减法 % 表示取余(模) ^ 表示乘方(指数)

数值表达式的构成格式为:

$ operand1 operator operand2

在上述表达式中,operand1 和 operand2 可以是数值或者变量的名称,而 operator 则可以是前文提到的任一运算符。

下面是一些示例,展示了如何构建数值表达式:

counter=0
num1=5
num2=10
num3=num2-num1
counter=counter+1

要理解在 Awk 中数值表达式的运用,来看下面的例子,这个例子中用到了一个名为 domains.txt 的文件,这个文件列出了 Tecmint 所持有的所有域名。

news.tecmint.com
tecmint.com
linuxsay.com
windows.tecmint.com
tecmint.com
news.tecmint.com
tecmint.com
linuxsay.com
tecmint.com
news.tecmint.com
tecmint.com
linuxsay.com
windows.tecmint.com
tecmint.com

要查看文件的内容,请使用以下命令:

$ 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 tecmint.com 
                awk  '/^tecmint.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 文件中有 6 行包含 howtoing.com,以确认您可以手动计算它们。

赋值运算符

接下来,将探讨 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 tecmint.com 
                awk  '/^tecmint.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

[1]Source: https://www.tecmint.com/learn-awk-variables-numeric-expressions-and-assignment-operators/

相关推荐

Linux 6.15将更新媒体子系统:高通Iris驱动首次亮相

IT之家3月24日消息,科技媒体phoronix昨日(3月23日)发布博文,报道称Linux6.15内核将于本周启动合并窗口,首批提交的PullRequest请求之一,就...

Ubuntu 25.04发行版登场:Linux 6.14内核,带来多项技术革新

IT之家4月18日消息,科技媒体linuxiac昨日(4月17日)发布博文,报道称代号为PluckyPuffin的Ubuntu25.04发行版正式上线,搭载最新Linu...

WordPress 6.8 版本发布:聚焦性能升级,代号“Cecil”

WordPress6.8版本发布:聚焦性能升级,代号“Cecil”全球最受欢迎的内容管理系统(CMS)WordPress正式推出最新版本6.8,代号“塞西尔”(Cecil),以此致敬传奇钢琴家...

Linus Torvalds接受微软Hyper-V升级 下一代Linux启动会更快

虽然Windows的粉丝和Linux的粉丝经常喜欢进行激烈的键盘大战,但操作系统的制造商们自己也了解彼此的优缺点。毫无疑问,微软也明白这一点,事实上,它甚至鼓励用户尝试Linux,尽管是使用...

Debian 12发布:Linux内核升级6.1(debian更新内核)

IT之家6月11日消息,Debian是最古老的GNU/Linux发行版之一,也是许多其他基于Linux的操作系统的基础,包括Ubuntu、Kali、MX和树莓派OS等。这...

Linux Mint预告新功能:升级Nemo搜索、LMDE 7支持OEM安装

IT之家4月10日消息,LinuxMint发布了最新月度简讯,宣布增强Nemo文件管理器的文件搜索功能、Cinnamon桌面环境开始支持Wayland、LMDE7(LinuxM...

Linux 6.2合并大量网络系统更新:推进Wi-Fi 7和800 Gbps网络

IT之家12月15日消息,Linux6.2合并窗口期内已经确认将会合并大量网络子系统更新。和以往版本相同,Linux6.2内核更新周期在网络功能上有大量的改进,更多的细节可以访问这条...

Linux内核升级实践指南(linux内核怎么升级)

Linux内核升级是一个需要谨慎操作的过程,但掌握正确方法后可以显著提升系统性能、安全性或硬件兼容性。以下是一份详细的实践指南,涵盖主流方法及注意事项:一、准备工作查看当前内核版本bashuname...

Linux又将迎来大版本更新 5.20版可能会被称为Linux 6.0

如果你错过了昨天Linux5.19的发布公告,那么这一消息需要回顾一下:被称为Linux5.20的开发中的内核很可能会被称为Linux6.0。根据LinusTorvalds对现代版本的划分,L...

周六的娱乐就是安装一台OracleLinux虚拟机(一)

每个人有每个人的娱乐方式。老父亲可能喜欢摆弄一些机械工具修修补补。我趁着周六安装一套OracleLinux,寓学于乐。在oracle网站上,下载VirtualBox,现在最新版本是7.0.8。在安装过...

Linux系统下Gaussian 16的安装(linux系统如何安装新软件)

Gaussian是目前使用最多的量子化学计算软件,当前最新的版本为Gaussian16C.01。理论上来说Gaussian并不需要安装,因为高斯一般是不出售源代码的,只有二进制文件,以Gaussi...

「Linux基础」VMWare虚拟机安装CentOS后配置静态ip

在VMWare中安装本地虚拟机CentOS7操作系统,动态IP地址会经常变化,不便于管理与实验。为了便于实验,考虑设置成静态IP地址,目标是本地局域网可以通过NAT网关互相访问,且能连接互联网。由于是...

Win10虚拟机,Hyper-V安装CentOS,一次成功

打开控制面板,选择程序选择启用或关闭Windows功能选中Hyper-V下所有的组件。提示我们需要,重启计算机,保存我们的文件,之后点击“立即重新启动”选择开始菜单,输入Hy,就可以打开虚拟机管理器了...

如何在Windows 10中的Hyper-V虚拟机上安装CentOS Linux

注意双重引导的一种可行且相当不错的替代方法是在虚拟机上安装各种操作系统。Microsoft正式支持CentOS作为Hyper-V的来宾OS,并且在安装时可以很好地集成。自CentOS6.4版以来,用...

安装Linux虚拟机的5个理由,以及不安装的5个原因

虚拟机(VM)允许你在不永久更改计算机的情况下探索Linux。如果你对Linux很好奇,但犹豫是否要尝试,VM提供了一个安全、灵活的解决方案。如果这是你第一次听说虚拟机,虚拟机就像“计算机中的计算机”...