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

引言

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

alt

这些概念与你之前可能在诸如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
alt

接下来,可以使用变量 first_name 和 second_name 来分别保存名单上第一位用户的名和姓氏,具体可以通过执行下面的 Awk 命令来实现:

$ awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt

alt

再让来看一个例子,当你在你的终端中输入命令 uname -a 时,它会显示出你的系统的全部信息。

在输出的第二字段中包含了你的主机名,因此可以将这个主机名存储到一个名为 hostname 的变量里,然后通过 Awk 命令如下打印出来:

$ uname -a
$ uname -a | awk '{hostname=$2 ; print hostname ; }' 
alt

数字表达式

在 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
alt

如果想计算域 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
alt

创建脚本后,保存它并使其可执行,当使用文件domains.txt作为输出运行它时,得到以下输出:

$ ./script.sh  ~/domains.txt
alt

从脚本的输出来看,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
alt
Reference
[1]

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

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/575550.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SaaS云HIS平台源码 采用云部署模式,部署一套可支持多家医院共同使用

目录 云HIS门诊业务使用流程 云HIS住院业务使用流程 云HIS系统使用流程 云HIS优势 云HIS系统功能模块 医疗业务: 电子病历: 经济管理: 药物管理: 统计报表: 系统管理: 运营运维: 通…

NLP step by step -- 了解Transformer

Transformer模型 Transformer相关历史 首先我们先看一下有关Transformer模型的发展历史,下面的图是基于Transformer架构的一些关键模型节点: 图片来源于Hugging Face 图片来源于Hugging Face Transformer 架构 于 2017 年 6 月推出。原本研究的重点是…

deepin 亮相 Intel 合作伙伴交流会,展示AI大模型应用最新成果

内容来源:deepin 社区 2024 年 4 月 18 日,备受业界瞩目的 Intel Channel Partner Networking Fair 在香港天际万豪酒店隆重举办。 在这场行业盛会上,deepin(深度)受邀参与了 Intel Demo Showcase 环节,向…

JDBC查询大数据时怎么防止内存溢出-流式查询

文章目录 1.前言2.流式查询介绍3.使用流式查询3.1不开启流式查询的内存占用情况3.2开启流式查询的内存占用情况 4.开启流式查询的注意点 1.前言 在使用 JDBC 查询大数据时,由于 JDBC 默认将整个结果集加载到内存中,当查询结果集过大时,很容易…

python与pycharm如何设置文件夹为源代码根目录

相信大家遇到过下面这种情况 当我们在当前项目下引入了其它项目的代码,这是其它项目的包的导入路径是不用于当前项目的,这样导致项目无法正常起来,但是我们又不可能一个个文件去处理,这时可以用下面的方式解决 pycharm直接设置 …

Centos 5 的yum源

背景 有使用较老的Centos 5 系统内部安装软件无法正常报错,是由于系统叫老yum源存在问题 处理方法 更换下述yum源,可以将其他repo源文件备份移动到其他目录,添加下述源后重新测试 [C5.11-base] nameCentOS-5.11 baseurlhttp://vault.c…

非对称渐开线齿轮学习笔记分享

最近有小伙伴遇到了非对称渐开线齿轮的加工问题,花了些时间学习了解一下,下面是总结的学习笔记,有兴趣的朋友可以瞅瞅: 目录: 为什么要采用非对称? 非对称有什么优点? 非对称齿形如何加工? 非对称齿轮怎么测量? 非对称齿轮建模 为什么要采用非对称? 现在的传动要求…

【SSM进阶学习系列丨整合篇】Spring+SpringMVC+MyBatis 框架配置详解

文章目录 一、环境准备1.1、创建数据库和表1.2、导入框架依赖的jar包1.3、修改Maven的编译版本1.4、完善Maven目录1.5、编写项目需要的包1.6、编写实体、Mapper、Service 二、配置MyBatis环境2.1、配置mybatis的主配置文件2.2、编写映射文件2.3、测试环境是否正确 三、配置Spri…

streamlit data_editor学习之 LLM理论内存占用量计算器

streamlit data_editor学习之 LLM理论内存占用量计算器 一.效果二.代码三.运行命令四.参考链接 根据用户设置的LLM参数,计算设备内存的占用量。以web的形式方便共享,可以插入多条记录,表格更新后,可以动态计算结果 一.效果 二.代码 import streamlit as st #1.31.1 import cv…

【八股】Spring Boot

SpringBoot是如何实现自动装配的? 首先,SpringBoot的核心注解SpringBootApplication里面包含了三个注解,SpringBootConfigurationEnableAutoConfigurationComponentScan,其中EnableAutoConfiguration是实现自动装配的注解&#x…

如何最大程度使用AWS?

随着云计算技术的不断发展,AWS已经成为众多企业的首选,为其提供了强大的基础设施和服务。那么如何最大程度地、灵活地利用AWS,成为许多企业专注的焦点。九河云作为AWS的合作伙伴,为读者们提供一些技巧和策略,帮助读者充…

UL认证防逆流多功能监测装置AGF-AE-D

安科瑞薛瑶瑶18701709087/17343930412 在单逆变器系统中,仪表直接与逆变器相连。如果您的变频器有一个内置的收入等级表(RGM;该变频器 被称为收入等级变频器),您可以在 RGM 的同一总线上连接一个外部仪表。

【React】Sigma.js框架网络图-入门篇(2)

通过《【React】Sigma.js框架网络图-入门篇》有了基本认识 由于上一篇直接给出了基本代码示例,可能看着比较复杂也不知道是啥意思; 今天从理论入手重新认识下! 一、基本认识 首先,我们先了解下基础术语: 图(Graph)&…

波高仪:数字浪高仪解析

波高仪,也被称为数字浪高仪,是一种专门用于测量波浪高度的设备。它采用低功耗微处理器、24bit高精度AD转换器和长距离通信技术,配备电容式波高传感器,具有线性好、功耗低、量精度高、传输距离远、性能稳定、抗干扰能力强等特点。 …

vue中使用echarts实现X轴动态时间(天)的折线图表

项目要求x轴以一天为间隔&#xff0c;时间是动态返回的数据&#xff0c;折线图平滑展示 实现代码如下&#xff1a; <div class"echarts-main"><v-chart ref"echarts" :options"options" /> </div>// 局部引入vue-echarts im…

Python实现线性拟合及绘图

Python实现线性拟合及绘图 当时的数字地形实验&#xff0c;使用matplotlib库绘制了一张图表表示不同地形类别在不同分辨率下的RMSE值&#xff0c;并分别拟合了一条趋势线。现在来看不足就是地形较多时&#xff0c;需要使用循环更好一点&#xff0c;不然太冗余了。 代码逻辑 …

【讯为Linux驱动笔记1】申请一个字符设备

Linux下每个设备都需要有一个专属设备号&#xff1a;主设备号 次设备号 【申请字符设备】 主设备号&#xff1a;一类驱动&#xff1a;如&#xff1a;USB驱动 次设备号&#xff1a;这类驱动下的某个设备 如&#xff1a;键盘鼠标 设备号是32位的dev_t类型的&#xff0c;高12位主…

Python对Excel两列数据进行运算

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python对Excel两列数据进行运算 在日常工作中&#xff0c;经常会遇到需要对Excel表格中的数…

Scala 04 —— Scala Puzzle 拓展

Scala 04 —— Scala Puzzle 拓展 文章目录 Scala 04 —— Scala Puzzle 拓展一、占位符二、模式匹配的变量和常量模式三、继承 成员声明的位置结果初始化顺序分析BMember 类BConstructor 类 四、缺省初始值与重载五、Scala的集合操作和集合类型保持一致性第一部分代码解释第二…