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

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

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

引言

本部分[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/

相关推荐

Java程序员必备的Linux命令速查表

Java程序员必备的Linux命令速查表在Java开发的世界里,Linux就像一位默默支持的幕后英雄。作为一名Java开发者,掌握一些基本的Linux命令,不仅能提高工作效率,还能让你在团队中显得格外...

Linux 命令速查手册:这 30 个高频指令,拯救 90% 的运维小白!

在Linux系统的世界里,命令行是强大的武器。对于运维小白而言,掌握一些高频使用的Linux命令,能极大提升工作效率,轻松应对各种系统管理任务。今天,就为大家奉上精心整理的30个Linu...

linux磁盘管理相关命令(linux磁盘管理常用命令)

磁盘的使用情况会直接影响系统的性能,因此我们经常会用到以下命令,主要围绕:fdisk:磁盘分区df:文件系统的磁盘空间占用情况du:文件目录的磁盘空间占用情况查看磁盘关系lsblk查看磁盘分区情况fd...

第四章 Linux常用shell命令-4.5.磁盘管理

主要介绍一下跟磁盘管理相关命令,有比较多的内容摘抄自网络,如有侵权,请及时联系我删除:显示目前在Linux系统上的文件系统磁盘使用情况统计:df创建和维护分区表的程序:fdisk将磁盘分区或镜像挂...

Linux新手必备:20个高效命令轻松掌握!

Linux基本命令使用指南在现代计算机操作系统中,Linux因其开放性、灵活性和强大的功能,广泛应用于服务器和开发环境中。作为技术人员,掌握Linux的基本命令是非常重要的。在本文中,我们将重点介绍2...

每日必学Linux命令:ls命令(linux命令详解之ls命令)

ls命令是linux下最常用的命令。ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单。通过ls命令不仅可以查看linux文件...

Linux系统dev和proc目录详解(linux dev/sr0)

简介:Linux系统里的/dev和/proc目录那可是相当重要的系统文件。在Linux系统中,/dev目录专门用来存放设备文件。不光有设备文件,系统里还有好多特殊功能也是通过设备的形式...

Linux切换目录之cd命令(linux切换指定目录)

1.基本概念1.1命令作用当我们在Linux系统上工作时,做得相当多的一项任务就是在不同的目录之间进行切换,这时就需要用到cd命令了。cd是"changedirectory"的首...

Linux切换目录(cd命令)(linux如何切换到目录)

cd命令,是ChangeDirectory的缩写,用来切换工作目录。Linux命令按照来源方式,可分为两种,分别是Shell内置命令和外部命令。所谓Shell内置命令,就是Shel...

MongoDB数据库的快速部署和启动(mongodb的使用教程)

一、Mongodb介绍常见数据库介绍关系数据库RDBMS设计表结构,通过SQL语句进行操作。连表关系常见的关系型数据库:mysqloracle(商业)DB2(IBM)sqlserver(微软...

5分钟学会网络服务搭建,飞凌i.MX9352 + Linux 6.1实战示例

在“万物互联”的技术浪潮下,网络服务已成为连接物理世界与数字世界的核心纽带,它不仅赋予了终端设备“开口说话”的能力,更构建了智能设备的开发范式。本文就将以飞凌嵌入式OK-MX9352-C开发板(搭载了...

centos安装geoserver并配置开机启动

前提条件:服务器已经安装了java环境一、下载下载地址:http://geoserver.org/release/maintain/下载后文件名为:geoserver-2.19.3-bin.zip二、...

开机启动流程(开机流程图)

grubandbootCentos5,6的开机启动流程grubCentos7的开机启动流程Centos5,6的开机启动流程initrd/initramfs一般存储在/boot目录下,以.img...

Linux cron服务概述(crontab服务)

cron是Linux/Unix系统中一个非常重要的后台服务(守护进程),用于在预定的时间间隔自动执行命令或脚本。它使得自动化重复性任务成为可能,例如日志清理、数据备份、系统维护等。1.cron...

CentOS 8利用rc.local进行开机自启动的配置

CentOS8利用rc.local进行开机自启动的配置CentOS8linux系统是不建议使用rc.local进行开机自启动的,建议创建systemdservice。我们为了方便以后多一个配置...