windows ubuntu sed,awk,grep篇:10.awk 变量的操作符

目录

62. 变量

64. 算术操作符

65. 字符串操作符

66. 赋值操作符

67. 比较操作符

68. 正则表达式操作符


62. 变量

Awk 变量以字母开头,后续字符可以是数字、字母、或下划线。关键字不能用作 awk 变量。
不像其他编程语言, awk 变量可以直接使用而不需事先声明。如果要初始化变量,最好在
BEGIN 区域内作,它只会执行一次。
Awk 中没有数据类型的概念,一个 awk 变量是 number 还是 string 取决于该变量所处的上下
文。
employee-sal.txt 示例文件
emploeyee-sal.txt 以逗号作为字段分隔符,包含五个雇员的信息,格式如下 :
employee-numer,employee-name,employee-title,salary
创建下面文件 :
$ vi employee-sal.txt
101,John Doe,CEO,10000
102,Jason Smith,IT Manager,5000
103,Raj Reddy,Sysadmin,4500
104,Anand Ram,Developer,4500
105,Jane Miller,Sales Manager,3000
下面的例子将教你如何在 awk 中创建和使用自己的变量,该例中, ”total” 便是用户建立的用
来存储公司所有雇员工资总和的变量。
$ vi total-company-salary.awk
BEGIN {
FS=",";
total=0;
}
{
print $2 "'s slary is: " $4;
total=total+$4
}
END {
print "---\nTotal company salary =$"total;
}
$ awk -f total-company-salary.awk employee-sal.txt
John Doe's slary is: 10000
Jason Smith's slary is: 5000
Raj Reddy's slary is: 4500Anand Ram's slary is: 4500
Jane Miller's slary is: 3000
---
Total company salary =$27000
63. 一元操作符
只接受单个操作数的操作符叫做一元操作符。
下面的例子使用取反操作 :
$ awk -F, '{print -$4}' employee-sal.txt
-10000
-5000
-4500
-4500
-3000
下面的例子演示取正、取反操作符对文件中存放的复数的作用:
$ vi negative.txt
-1
-2
-3
$ awk '{print +$1}' negative.txt
-1
-2
-3
$ awk '{print -$1}' negative.txt
1
2
3
自增和自减操作
自增和自减改变变量的值,它可以在使用变量“之前”或“之后”改变变量的值。在表达式
中,使用的可能是改变前的值 (post) 或改变后的值 (pre). 使用改变后的变量值 (pre) 即是在变量前面加上 ++( --) ,首先把变量的值加 1( 或减 1) ,然后
把改变后的值应用到表达式的其它操作中。
使用改变前的变量值 (post) 即是在变量后面加上 ++( --) ,首先把变量值应用到表达式中进行
计算,然后把变量的值加 1( 或减 1)
Pre 自增示例 :
$ awk -F, '{print ++$4}' employee-sal.txt
10001
5001
4501
4501
3001
Pre 自减示例 :
$ awk -F, '{print --$4}' employee-sal.txt
9999
4999
4499
4499
2999
Post 自增示例 :
( 因为 ++ print 语句中,所以变量的原始值被打印 )
$ awk -F, '{print $4++}' employee-sal.txt
10000
5000
4500
4500
3000
Post 自减示例 :
( 因为 ++ 是单独语句,所以自增后的值被打印 )
$ awk -F, '{$4++;print $4}' employee-sal.txt
10001
5001
4501
4501
3001
Post 自减示例 :
( 因为 print 语句中,所以变量原始值被打印 )
$ awk -F, '{print $4--}' employee-sal.txt
10000
5000
4500
4500
3000
Post 自减示例 :
( 因为 在单独语句中,所以自减后的值被打印 )
$ awk -F, '{$4--;print $4}' employee-sal.txt
9999
4999
4499
4499
2999
下面是一个有用的例子,显示所有登录到 shell 的用户数,即哪些用户可以登录 shell 并获得
命令提示符。
使用算后自增运算符 ( 尽管变量值只到 END 区域才打印出来,算前自增仍会产生同
样的结果 )
脚本的 body 区域包含一个模式匹配,因此只有最后一个字段匹配模式 /bin/bash 时,
body 的代码才会执行
提示 : 正则表达式应该包含在 // 之间,但如果正则表达式中的 / 必须转移,以避免被
解析为正则表达式的结尾
当有匹配到模式的行时,变量 n 的值增加 1 ,最终的值在 END 区域打印出来。
打印所有可登陆 shell 的用户总数 :
$ awk -F':' '$NF ~ /\/bin\/bash/ { n++ }; END { print n }' /etc/passwd
2

64. 算术操作符

需要两个操作数的操作符,成为二元操作符。 Awk 中有多种基本二元操作符 ( 如算术操作符、
字符串操作符、赋值操作符,等等 )
下面是算术运算操作符 :
下面的例子展示 +,-,*,/ 的用法 . 下面例子完成两个事情 :
1. 将每件单独的商品价格减少 20%
2. 将每件单独的商品的数量减少 1
创建并运行 awk 算术运算脚本 :
$ vi arithmetic.awk
BEGIN {
FS=",";
OFS=",";
item_discount=0;
}
{
item_discount=$4*20/100;
print $1,$2,$3,$4-item_discount,$5-1;
}
$ awk -f arithmetic.awk items.txt
101,HD Camcorder,Video,168,9
102,Refrigerator,appliance,680,1
103,MP3 Player,Audio,216,14
104,Tennis Racket,Sports,152,19
105,Laser Printer,Office,380,4
下面的例子只打印偶数行。打印前会检查行号是否能被 2 整除,如果整除,则执行默认的操
( 打印整行 ).
取模运算演示 :
$ awk 'NR % 2 == 0' items.txt
102,Refrigerator,appliance,850,2
104,Tennis Racket,Sports,190,20

65. 字符串操作符

( 空格 ) 是连接字符串的操作符。
下面例子中,有三处使用了字符串连接。在语句 ”string3=string1 string2” 中, string3 包含了
string1 string2 连接后的内容。每个 print 语句都把一个静态字符串和 awk 变量做了连接。
ᨀ示 : 这个操作符解释了为什么在打印多个变量时,如果要使用 OFS 分隔每个字段,就需要
print 语句中用逗号分隔每个变量。如果没有使用逗号分隔,那么会把所有值连接成一个
字符串。 $ cat string.awk
BEGIN {
FS=",";
OFS=",";
string1="Audio";
string2="Video";
numberstring="100";
string3=string1 string2;
print "Concatenate string is:" string3;
numberstring=numberstring+1;
print "String to number:" numberstring;
}
$ awk -f string.awk items.txt
Concatenate string is:AudioVideo
String to number:101

66. 赋值操作符

与其他大部分编程语言一样, awk 使用 = 作为赋值操作符。和 C 语言一样, awk 支持赋值
的缩写方式。
下面的例子演示如何使用赋值 :
$ cat assignment.awk
BEGIN {
FS=",";
OFS=",";
total1 = total2 = total3 = total4 = total5 = 10;
total1 += 5; print total1;
total2 -= 5; print total2;
total3 *= 5; print total3;
total4 /= 5; print total4;
total5 %= 5; print total5;
} $ awk -f assignment.awk
15
5
50
2
0
下面的例子使用加法赋值的缩写形式 .
显示所有商品的清单:
$ awk -F ',' 'BEGIN { total=0 } { total += $5 } END {print "Total Quantity: " total }' items.txt
Total Quantity: 52
下面的例子统计输入文件中所有的字段数。 Awk 读取每一行,并把字段数量增加到变量 total
中。然后在 END 区域打印该变量。
$ awk -F ',' 'BEGIN { total = 0 } { total += NF } END { print total }' items.txt
25

67. 比较操作符

提示:下面的例子,如果不指定操作, awk 会打印符合条件的整条记录。
打印数量小于等于临界值 5 的商品信息:
$ awk -F ',' '$5 <= 5' items.txt
102,Refrigerator,appliance,850,2
105,Laser Printer,Office,475,5
打印编号为 103 的商品信息:
$ awk -F "," '$1 == 103' items.txt
103,MP3 Player,Audio,270,15
提示 : 不要把 ==( 等于 ) =( 赋值 ) 搞混了。
打印编号为 103 的商品的描述信息 :
$ awk -F "," '$1 == 103 { print $2}' items.txt
MP3 Player
打印除 Video 以外的所有商品:
$ awk -F "," '$3 != "Video"' items.txt
102,Refrigerator,appliance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5
和上面相同,但只打印商品描述信息:
$ awk -F "," '$3 != "Video" { print $2}' items.txt
Refrigerator
MP3 Player
Tennis Racket
Laser Printer
使用&&比较两个条件,打印价钱低于 900 并且数量小于等于临界值 5 的商品信息:
$ awk -F "," '$4 < 900 && $5 <= 5' items.txt
102,Refrigerator,appliance,850,2
105,Laser Printer,Office,475,5
和上面相同,但只打印商品描述信息:
$ awk -F "," '$4 < 900 && $5 <= 5 {print $2}' items.txt
Refrigerator
Laser Printer
使用||比较两个条件,打印价钱低于 900 或者数量小于等于临界值 5 的商品信息:
$ awk -F "," '$4 < 900 || $5 <= 5' items.txt
101,HD Camcorder,Video,210,10
102,Refrigerator,appliance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,
和上面相同,但只打印商品描述信息:
$ awk -F "," '$4 < 900 || $5 <= 5 {print $2}' items.txt
HD Camcorder
Refrigerator
MP3 Player
Tennis Racket
Laser Printer 下面例子使用 > 条件,打印 /etc/password 中最大的 UID( 以及其所在的整行 ) Awk 把最大的
UID( 3 个字段 ) 放在变量 maxuid 中,并且把包含最大 UID 的行复制到变量 maxline 中。循
环执行完后,打印最大的 UID 和其所在的行。
$ awk -F ':' '$3 > maxuid { maxuid = $3; maxline = $0 } END { print maxuid,maxline }' /etc/passwd
65534 nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
打印/etc/passwd UID GROUP ID 相同的用户信息
$ awk -F ':' '$3 == $4' /etc/passwd
root:x:0:0:root:/root:/bin/bash
打印/etc/passwd UID >= 100 并且用户的 shell /bin/sh 的用户:
$ awk -F ':' '$3 >= 100 && $NF ~ /\/bin\/sh/ ' /etc/passwd
mygame:x:2300:0::/opt/game:/bin/sh
打印 /etc/passwd 中没有注释信息 ( 5 个字段 ) 的用户 :
mkey3g@mkey:/opt/mkey3g/ec> awk -F ':' '$5 == ""' /etc/passwd
mfs:x:2001:1000::/home/mfs:/bin/nologin

68. 正则表达式操作符

使用 == 时, awk 检查精确匹配。 下面的例子不会打印任何信息,因为 items.txt 中,没有任
何一条记录的第二个字段精确匹配关键字 ”Tennis”,”Tennis Racket” 不是精确匹配。
打印第二个字段为 ”Tennis” 的记录 :
$ awk -F "," '$2 == "Tennis"' items.txt
当使用 ~ 时, awk 执行模糊匹配,检索 包含 关键字的记录 .
打印第二个字段包含 ”Tennis” 的行 :
$ awk -F "," '$2 ~ "Tennis"' items.txt
104,Tennis Racket,Sports,190,20
!~ 对应 ~, 即不匹配 .
打印第二个字段不包含 ”Tennis” 的行 :
$ awk -F "," '$2 !~ "Tennis"' items.txt
101,HD Camcorder,Video,210,10
102,Refrigerator,appliance,850,2
103,MP3 Player,Audio,270,15
105,Laser Printer,Office,475,5
下面的例子打印 shell /bin/bash 的用户的总数,如果最后一个字段包含 ”/bin/bash”, 则变量
n 增加 1
$ awk -F ':' '$NF ~ /\/bin\/bash/ { n++ } END { print n }' /etc/passwd
13

资料来源于《SedandAwk101Hacks》,大家有兴趣可以买一本,也可以关注我,我更新完它。

曾经,我花费大半月将它们跑完,现在啥都忘了,还是要常用。

只为学习交流,不为获利,侵权联系立删。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实习面试之算法准备:数学题

目录 1 技巧2 例题2.1 Nim 游戏2.2 石子游戏2.3 灯泡开关 1 技巧 稍加思考&#xff0c;找到规律 2 例题 2.1 Nim 游戏 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xf…

SpringBoot 打包所有依赖

SpringBoot 项目打包的时候可以通过插件 spring-boot-maven-plugin 来 repackage 项目&#xff0c;使得打的包中包含所有依赖&#xff0c;可以直接运行。例如&#xff1a; <plugins><plugin><groupId>org.springframework.boot</groupId><artifact…

2024五一杯数学建模B题思路代码文章教学-交通需求规划与可达率问题

交通需求规划与可达率问题 问题总结&#xff1a; 问题一&#xff1a;在一个小型交通网络中&#xff0c;给定的起点和终点之间的交通需求需分配到相应路径上。目标是最大化任意一条路段出现突发状况时的交通需求期望可达率。 问题二&#xff1a;在一个较大的交通网络中&#xff…

负债56亿,购买理财产品遭违约,操纵虚假粉丝,流量在下滑,客户数量减少,汽车之家面临大量风险(三)

本文由猛兽财经历时5个多月完成。猛兽财经将通过以下二十二个章节、8万字以上的内容来全面、深度的分析汽车之家这家公司。 由于篇幅限制&#xff0c;全文分为&#xff08;一&#xff09;到&#xff08;十&#xff09;篇发布。 本文为全文的第七章、第八章、第九章。 目录 …

【Linux—进程间通信】共享内存的原理、创建及使用

什么是共享内存 共享内存是一种计算机编程中的技术&#xff0c;它允许多个进程访问同一块内存区域&#xff0c;以此作为进程间通信&#xff08;IPC, Inter-Process Communication&#xff09;的一种方式。这种方式相对于管道、套接字等通信手段&#xff0c;具有更高的效率&…

一文入门交叉编译

前言: 在阅读本文之前&#xff0c;你哦需要了解makefile文件的编写规则&#xff0c;这里我们推荐两篇入门: Makefile 规则-CSDN博客 Makefile 快速入门-CSDN博客 编译定义 编译是指将源代码文件&#xff08;如C/C文件&#xff09;经过预处理、编译、汇编和链接等步骤&#x…

如何从0深入PostgreSQL内核写一个执行器算子?

如何从0深入PostgreSQL内核写一个执行器算子&#xff1f; 大家好&#xff0c;我叫光城&#xff0c;昨天分享了一个主题&#xff1a;如何从0深入PostgreSQL内核写一个执行器算子&#xff1f;今天来总结一下&#xff0c;本篇文章的直播回放可以在b站观看&#xff0c;点击原文或者…

[PS小技能学习]抠图和切图

详情见视频教程&#xff1a;PS小技巧--抠图与切图 今天我们来学习如何使用PS对表情包合辑进行抠图和裁剪保存 1、首先&#xff0c;将图片导入&#xff0c;双击图层新建一个图层 2、然后点击工具栏的魔棒工具&#xff0c;再点击顶部菜单栏的添加到选区 3、点击图片的空白区域即…

IMU状态预积分功能实现与测试

IMU状态预积分功能实现与测试 前言实现IMU状态预积分类测试程序验证预积分与直接积分的效果结果 前言 预积分&#xff1a;是一种十分常见的IMU数据处理方法。 与传统的IMU运动学积分不同&#xff0c;预积分可以将一段时间内的IMU测量数据累积&#xff0c;建立预积分测量&#…

两院院士泌尿外科专家吴阶平教授

吴阶平&#xff08;1917-2011&#xff09;&#xff0c;男&#xff0c;江苏常州人&#xff0c;1933年天津汇文中学毕业&#xff0c;保送到北平燕京大学医预科&#xff0c;1937年毕业于北平燕京大学获理学士学位&#xff0c;1942年毕业于北平协和医学院获医学博士学位&#xff0c…

银行卡归属地查询API接口快速对接

银行卡归属地查询API接口指的是通过银行卡号查询该银行卡详细信息&#xff0c;包括银行卡名称、卡种、卡品牌、发卡行、编号以及归属地等信息&#xff0c;支持一千多家银行返回归属地信息&#xff0c;那么银行卡归属地查询API接口如何快速对接呢&#xff1f; 首先找到有做银行…

SpringBoot集成Kafka开发

4.SpringBoot集成Kafka开发 4.1 创建项目 4.2 配置文件 application.yml spring:application:name: spring-boot-01-kafka-basekafka:bootstrap-servers: 192.168.2.118:90924.3 创建生产者 package com.zzc.producer;import jakarta.annotation.Resource; import org.spri…

Thread类及常见方法

目录 1.Thread类概念 2.Thread的常见构造方法 3.Thread的几个常见属性 4.启动一个线程—start( ) 5.中断一个线程 1.使用自定义的变量来作为标志位 2.使用interrupt() 3.观察标志位是否被清除 6.等待一个线程-join() 7.获取当前线程引用 8.休眠当前线程 1.Thread类概…

GitHub Copilot 简单使用

因为公司安全原因&#xff0c;并不允许在工作中使用GitHub Copilot&#xff0c;所以&#xff0c;一直没怎么使用。最近因为有一些其它任务&#xff0c;所以&#xff0c;试用了一下&#xff0c;感觉还是很不错的。&#xff08;主要是C和Python编程&#xff09; 一&#xff1a;常…

探索洗牌算法的魅力与杨辉三角的奥秘:顺序表的实际运用

目录 目录 前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 洗牌算法 准备工作 买一副牌 洗牌 发牌 测试整体 &#x1f3af;&#x1f3af;很重要的一点 杨辉三角 总结 前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ …

06_电子设计教程基础篇(学习视频推荐)

文章目录 前言一、基础视频1、电路原理3、模电4、高频电子线路5、电力电子技术6、数学物理方法7、电磁场与电磁波8、信号系统9、自动控制原理10、通信原理11、单片机原理 二、科普视频1、工科男孙老师2、达尔闻3、爱上半导体4、华秋商城5、JT硬件乐趣6、洋桃电子 三、教学视频1…

分布式与一致性协议之Raft算法与一致哈希算法(一)

Raft算法 Raft与一致性 有很多人把Raft算法当成一致性算法&#xff0c;其实它不是一致性算法而是共识算法&#xff0c;是一个Multi-Paxos算法&#xff0c;实现的是如何就一系列值达成共识。并且&#xff0c;Raft算法能容忍少数节点的故障。虽然Raft算法能实现强一致性&#x…

相机知识的补充

一&#xff1a;镜头 1.1MP的概念 相机中MP的意思是指百万像素。MP是mega pixel的缩写。mega意为一百万&#xff0c;mega pixel 指意为100万像素。“像素”是相机感光器件上的感光最小单位。就像是光学相机的感光胶片的银粒一样&#xff0c;记忆在数码相机的“胶片”&#xff…

如何使用Go语言进行并发安全的数据访问?

文章目录 并发安全问题的原因解决方案1. 使用互斥锁&#xff08;Mutex&#xff09;示例代码&#xff1a; 2. 使用原子操作&#xff08;Atomic Operations&#xff09;示例代码&#xff1a; 3. 使用通道&#xff08;Channels&#xff09; 在Go语言中&#xff0c;进行并发编程是常…

buuctf-misc-23.FLAG

23.FLAG 题目&#xff1a;stegsolve得出PK-zip文件&#xff0c;改后缀名为zip,解压后查看文件类型为ELF 使用kali-strings或者ida获取flag 点击Save Bin将其另存为一个zip文件 而后解压我们另存的这个1234.zip文件后&#xff0c;可以得到 我们用ida打开它&#xff0c;打开后就…