Linux三剑客:awk的基本用法

目录

认识awk

使用awk

语法

常用命令选项

awk变量

内置变量

自定义变量

printf命令

格式

演示

操作符

格式

演示

awk PATTERN 匹配部分

格式

演示

awk有意思的案例


认识awk

  awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

  awk其实不仅仅是工具软件,还是一种编程语言。不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了。

使用awk

语法

awk` `[options] ``'program'` `var=value ``file``…``awk` `[options] -f programfile var=value ``file``…``awk` `[options] ``'BEGIN{ action;… } pattern{ action;… } END{ action;… }'` `file` `...

常用命令选项

  • -F fs:fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:

  • -v var=value:赋值一个用户定义变量,将外部变量传递给awk

  • -f scripfile:从脚本文件中读取awk命令

awk变量

变量:内置和自定义变量,每个变量前加 -v 命令选项

内置变量

(1)格式

  • FS输入字段分隔符默认为空白字符

  • OFS输出字段分隔符,默认为空白字符

  • RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效

  • ORS :输出记录分隔符,输出时用指定符号代替换行符

  • NF :字段数量,共有多少字段, $NF引用最后一列,$(NF-1)引用倒数第2列

  • NR行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始

  • FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始

  • FILENAME :当前文件名

  • ARGC :命令行参数的个数

  • ARGV :数组,保存的是命令行所给定的各参数,查看参数

(2)演示

[root@test ~]# cat awkdemo
hello:world
linux:redhat:lalala:hahaha
test:love:youou
[root@test ~]# awk -v FS=':' '{print $1,$2}' awkdemo  #FS指定输入分隔符
hello world
linux redhat
test love
//这里打印了以:为输入分隔符,打印了第一列和第二列
[root@test ~]# awk -v FS=':' -v OFS='---' '{print $1,$2}' awkdemo  #OFS指定输出分隔符
hello---world
linux---redhat
test---love
//这里以:为输入分隔符,---为输出分隔符,然后打印出了第一列和第二类
[root@test ~]# awk -v RS=':' '{print $1,$2}'  awkdemo
hello
world linux
redhat
lalala test
love
youou
//指定以:为换行符,并且原换行符无效
[root@test ~]# awk -v FS=':' -v ORS='---' '{print $1,$2}' awkdemo
hello world---linux redhat---test love---
//这里以:为输入分隔符,并且将‘---’替换\n 来输出第一列和第二列
[root@test ~]# awk -F: '{print NF}' awkdemo
2
4
3
//打印出了每行的字段数
[root@test ~]# awk -F: '{print $(NF-1)}' awkdemo  #显示倒数第2列
hello
lalala
love
//显示出倒数第二列
[root@test ~]# awk '{print NR}' awkdemo awkdemo1
1
2
3
4
5
//打印出行号
[root@test ~]# awk END'{print NR}' awkdemo awkdemo1
5
//打印出最后一行的行号
[root@test ~]# awk '{print FNR}' awkdemo awkdemo1
1
2
3
1
2
//一共两个文件,各文件分别计数, 行号,
[root@test ~]# awk '{print FILENAME}' awkdemo
awkdemo
awkdemo
awkdemo
//当前文件名
[root@test ~]# awk 'BEGIN {print ARGC}' awkdemo awkdemo1
3
//命令行参数的个数
[root@test ~]# awk 'BEGIN {print ARGV[0]}' awkdemo awkdemo1
awk
//第一个参数
[root@test ~]# awk 'BEGIN {print ARGV[1]}' awkdemo awkdemo1
awkdemo
//第二个参数
[root@test ~]# awk 'BEGIN {print ARGV[2]}' awkdemo awkdemo1
awkdemo1
//第三个参数

自定义变量

自定义变量( 区分字符大小写)

(1)-v var=value

① 先定义变量,后执行动作print

[root@centos111 test]# awk -v name="yps" -F: '{print name":"$0}' awkdemo
yps:hello:world
yps:linux:redhat:lalala:hahaha
yps:along:love:youou

② 在执行动作print后定义变量

[root@centos111 test]# awk  -F: '{print name":"$0;name="yps"}' awkdemo
:hello:world
yps:linux:redhat:lalala:hahaha
yps:along:love:youou

(2)在program 中直接定义

可以把执行的动作放在脚本中,直接调用脚本 -f

[root@centos111 test]# cat awk
{name="yps";print name,$1}
[root@centos111 test]# awk -F: -f awk awkdemo 
yps hello
yps linux
yps along

printf命令

比print更强大

格式

(1)格式化输出

printf` `"FORMAT"``, item1,item2, ...

① 必须指定FORMAT

不会自动换行,需要显式给出换行控制符,\n

③ FORMAT 中需要分别为后面每个item 指定格式符

(2)格式符:与item 一一对应

  • %c: 显示字符的ASCII码

  • %d, %i: 显示十进制整数

  • %e, %E: 显示科学计数法数值

  • %f :显示为浮点数,小数 %5.1f,带整数、小数点、整数共5位,小数1位,不够用空格补上

  • %g, %G :以科学计数法或浮点形式显示数值

  • %s :显示字符串;例:%5s最少5个字符,不够用空格补上,超过5个还继续显示

  • %u :无符号整数

  • %%: 显示% 自身

(3)修饰符:放在%c[/d/e/f...]之间

  • #[.#]:第一个数字控制显示的宽度;第二个# 表示小数点后精度,%5.1f

  • -:左对齐(默认右对齐) %-15s

  • +:显示数值的正负符号 %+d

演示

---筛选出/etc/passwd文件中的第一列个第三列
[root@centos111 test]# awk -F: '{print $1,$3}' /etc/passwd | grep root
root 0
---第一列显示小于5的字符串;第2列显示整数并换行
[root@centos111 test]# awk -F: '{printf "%5s--%u\n",$1,$3}' /etc/passwd root--0bin--1
daemon--2
...
---使用-进行左对齐;第2列显示浮点数
[root@centos111 test]# awk -F: '{printf "%-20s--%-10.3f\n",$1,$3}' /etc/passwd 
root                --0.000     
bin                 --1.000     
daemon              --2.000  
...

操作符

格式

  • 算术操作符:

    • x+y, x-y, x*y, x/y, x^y, x%y

    • -x: 转换为负数

    • +x: 转换为数值

  • 字符串操作符:没有符号的操作符,字符串连接

  • 赋值操作符:

    • =, +=, -=, *=, /=, %=, ^=

    • ++, --

  • 比较操作符:

    • ==, !=, >, >=, <, <=

  • 逻辑操作符:与&& ,或|| ,非!

  • 函数调用: function_name(argu1, argu2, ...)

  • 条件表达式(三目表达式):

    selector ? if-true-expression : if-false-expression

    • 注释:先判断selector,如果符合执行 ? 后的操作;否则执行 : 后的操作

演示

(1)模式匹配符

---查询以/dev开头的磁盘信息
[root@centos111 test]# df -h | awk '/^\/dev/'
/dev/mapper/centos-root   17G  9.5G  7.6G   56% /
/dev/sda1               1014M  254M  761M   25% /boot
---只显示磁盘使用状况和磁盘名
[root@centos111 test]# df -h | awk '/^\/dev/{print$(NF-1)"--"$1}'
56%--/dev/mapper/centos-root
25%--/dev/sda1
---查找磁盘大于40%的
[root@centos111 test]# df -h | awk '$0 ~ /^\/dev/{print$(NF-1)"--"$1}' | awk -F% '$1 > 40'
56%--/dev/mapper/centos-root

(2)逻辑操作符

[root@centos111 test]# awk -F: '$3>=0&&$3<=1000{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
...
[root@centos111 test]# awk -F: '$3==0||$3>=1000{print $1}' /etc/passwd
root
nfsnobody
user
user1
user2
[root@centos111 test]# awk -F: '!($3==0){print $1}' /etc/passwd 
bin
...
[root@centos111 test]# awk -F: '!(/bash$/){print $1,$3}' /etc/passwd
bin 1
daemon 2
...

(3)条件表达式(三目表达式)

[root@centos111 test]# awk -F: '{$3>=1000? usertype="common user":usertypr="sysadmin user";print usertype,$1,$3}' /etc/passwdroot 0bin 1
...
common user nfsnobody 65534
common user gnome-initial-setup 989
...

awk PATTERN 匹配部分

格式

PATTERN:根据pattern 条件,过滤匹配的行,再做处理

(1)如果未指定:空模式,匹配每一行

(2)/regular expression/ :仅处理能够模式匹配到的行,正则,需要用/ / 括起来

(3)relational expression:关系表达式,结果为“真”才会被处理

真:结果为非0值,非空字符串

假:结果为空字符串或0值

(4)line ranges:行范围

  startline(起始行),endline(结束行):/pat1/,/pat2/ 不支持直接给出数字,可以有多段,中间可以有间隔

(5)BEGIN/END 模式

  BEGIN{}: 仅在开始处理文件中的文本之前执行一次

  END{} :仅在文本处理完成之后执行

演示

[root@centos111 test]# awk -F: '{print $1}' awkdemo 
hello
linux
along
[root@centos111 test]# awk -F: '/hello/{print $1}' awkdemo 
hello
[root@centos111 test]# awk -F: '1{print $1}' awkdemo
hello
linux
along
[root@centos111 test]# awk -F: '0{print $1}' awkdemo
[root@centos111 test]# awk -F: '/^h/,/^a/{print $1}' awkdemo
hello
linux
along
[root@centos111 test]# awk -F: 'BEGIN{print "第一列"}{print $1} END{print "结束"}' awkdemo
第一列
hello
linux
along
结束

awk有意思的案例

"seq 10" 是一个 Linux 命令,表示生成一个从 1 到 10 的序列。

[root@centos111 test]# seq 10
1
2
3
4
5
6
7
8
9
10

---因为i=0,为假,所以不打印

[root@centos111 test]# seq 10 | awk 'i=0'

---i=1,为真,所以全部打印

[root@centos111 test]# seq 10 | awk 'i=1'
1
2
3
4
5
6
7
8
9
10

---只打印奇数行;奇数行i进入时本身为空,被赋为!i,即不为空,所以打印;偶数行i进入时本身不为空,被赋为!i,即为空,所以不打印

[root@centos111 test]# seq 10 | awk 'i=!i'
1
3
5
7
9

---解释上一个操作,i在奇偶行的值

[root@centos111 test]# seq 10 | awk '{i=!i;print i}'
1
0
1
0
1
0
1
0
1
0

---只打印偶数行,是上边打印奇数行的取反

[root@centos111 test]# seq 10 | awk '!(i=!i)'
2
4
6
8
10

---只打印偶数行;先对i进行赋值,即不为空,刚好和打印奇数行相反

[root@along ~]# seq 10 |awk -v i=1 'i=!i'
2
4
6
8
10

seq 100 |awk 'i=!i'
那这段是怎么理解?
首先我们要了解一下awk对于未定义的变量处理方法:
对于数值运算,未定义变量的话awk会赋予变量初值为0
对于字符运算,未定义变量的话awk会赋予变量初值为空字符串
了解了这两条我们再看awk 'i=!i'这条命令是什么含义,awk是对文本文件一行一行处理的,seq 100命令执行后是如下形式:
1

2

3

……

100
首相它读取第一行数据,也就是1,然后进行模式匹配,i是一个未定义的变量,上面我们提到了对于数值运算,未定义变量的话初值会为0,这时i的值即为0,也就是i=!0,那么!是什么呢?!就是取反的意思,等号右边其实就是个布尔值,0为假,1为真,这里是!0,那么它就为非假,也就是为真,真的值为1,因此i=!0(1)也就相当于i=1,到此i的值为1.

i的值为1后有什么作用呢?
i=1说明值为真,awk会认定模式为真,这时匹配是成功的,会把第一行输出到屏幕,可能有的人会问了这里只有i=!i,没有print,它怎么输出的?awk的格式为 模式{ 动作},如果只有模式没有动作,那么匹配成功后默认的会输出整条记录,也就是说这条命令完整的写法为:
seq 1 100 | awk 'i=!i{print $0}'
为什么第二行没有输出呢?
前面进行第一行模式匹配的时候i的值已经由0变为了1,在进行第二行操作的时候,i=!i变成了i=!1,这样i的值就又变成了0(假),所以第二行没有输出,到了处理第三行的时候,i=!i变成了i=!0,所以会输出第三行,以此类推……这样我们就可以输出奇数行而删除偶数行了。
那么如何输出偶数行呢?
我们可以加一个if判断一下,如果i的值为真我们就输出奇数行,如果为假就输出偶数行

[root@centos111 test]# seq 1 10 |awk '{i=!i;if(i) print $0}'
1
3
5
7
9
[root@centos111 test]# seq 1 10 |awk '{i=!i;if(!i) print $0}'
2
4
6
8
10

看到这儿又有朋友可能会问了,为什么现在把i=!i放到动作里了呢?
我们看这两条命令:

[root@centos111 test]# seq 1 10 |awk 'i=!i{print !i}'
0
0
0
0
0
[root@centos111 test]# seq 1 10 |awk 'i=!i{print i}'
1
1
1
1
1

如果把i=!i放到模式里边它会进行匹配,把匹配的结果传递给动作,那个时候已经把不匹配的舍去了,所以我们无法用if来判断i的值。

到这里awk的一些基本用法就结束了,下一篇会继续介绍awk的高级用法

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

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

相关文章

我的 2023 秋招总结,拿到了大厂offer

2023秋招小结 前言 & 介绍 作为2024年毕业的学生&#xff0c;在2023年也就是今年秋招。 现在秋招快结束了&#xff0c;人生可能没有几次秋招的机会&#xff08;应该就一次&#xff0c;最多两次吧哈哈&#xff09;&#xff0c;也有一点感悟&#xff0c;所以小小总结一下。…

如何用继承和多态来打印个人信息

1 问题 在python中的数据类型中&#xff0c;我们常常运用继承和多态。合理地使用继承和多态可以增强程序的可扩展性使代码更简洁。那么如何使用继承和多态来打印个人信息&#xff1f; 2 方法 打印基本信息添加子类&#xff0c;再定义一个class&#xff0c;可以直接从Person类继…

element-ui plus 文件上传组件,设置单选,并支持替换和回显

遇到的坑&#xff1a; 1、设置limit属性为1后&#xff0c;on-change属性不生效 2、on-exceed属性虽然值改变&#xff0c;但是回显没有随之变化 3、由于element-ui plus版本file-list值出现问题 最后的解决方案决定不设置 limit 属性&#xff0c;通过 on-change 中的判断来控制数…

网络规模与性能优化的一篇随笔

本周写篇轻松的话题&#xff0c;注意信息传输的尺度和缩放比例&#xff0c;写篇随笔。 控制面和数据面随规模缩放的影响&#xff0c;举几个例子就能说明白。 CSMA/CD&#xff0c;控制面和数据面在一起&#xff0c;控制信息交互时延和数据面时延在同一尺度时&#xff0c;就到了…

Auto.js 清除指定应用缓存

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!Auto.js 清除指定应用缓存 环境 win10Pixel4Android13var packageName = ""; // 包名 var resu…

05 robotFrameWork+selenium2library 一维数组的使用

一、原生数组&#xff1a; 1、Excel中&#xff1a; LIST_OneRange 项目1|项目2 2、生成的PY&#xff1a; LIST_OneRange [u项目1,u项目2] 3、脚本使用&#xff1a; :FOR ${Local_I} IN RANGE len(${OneRange}) ${value} Evaluate ${OneRange}[${Local_I}] …

soc估计:DESIGN AND DEVELOPMENT OF SoC ESTIMATION MODEL USING MACHINE LEARNING

这是一篇印度那边学生的毕业论文&#xff0c;唯一要记录的是里面提到了一个特征构造的思想&#xff0c;记录如下&#xff1a; 论文思想&#xff1a; 特征选用速度、电流、电压、温度、平均电压、平均电流、平均速度&#xff0c;模型用cnnlstmlrlr 平均特征计算方式&#xff1a;…

​LeetCode解法汇总307. 区域和检索 - 数组可修改

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个数…

ASP.NET限流器的简单实现

一、滑动时间窗口 我为RateLimiter定义了如下这个简单的IRateLimiter接口&#xff0c;唯一的无参方法TryAcquire利用返回的布尔值确定当前是否超出设定的速率限制。我只提供的两种基于时间窗口的实现&#xff0c;如下所示的基于“滑动时间窗口”的实现类型SliddingWindowRateL…

Java编程中,异步操作流程中,最终一致性以及重试补偿的设计与实现

一、背景 微服务设计中&#xff0c;跨服务的调用&#xff0c;由于网络或程序故障等各种原因&#xff0c;经常会出现调用失败而需要重试。另外&#xff0c;在异步操作中&#xff0c;我们提供接口让外部服务回调。回调过程中&#xff0c;也可能出现故障。 这就要求我们主动向外…

linux rsyslog日志采集格式设定五

linux rsyslog日志采集格式设定五 1.创建日志接收模板 打开/etc/rsyslog.conf文件,在GLOBAL DIRECTIVES模块下任意位置添加以下内容 命令: vim /etc/rsyslog.conf 测试:rsyslog.conf文件结尾添加以下内容 $template ztj,"%fromhost-ip% %app-name% %syslogseveri…

vim批量多行缩进调整

网上其他教程&#xff1a; ctrl v 或者 v进行visual模式按方向键<&#xff0c;>调整光标位置选中缩进的行Shift > &#xff08;或者 Shift < &#xff09;进行左右缩进。 我只想说&#xff0c;乱七八糟&#xff0c;根本不管用 本文教程&#xff1a; 增加缩进…

物联网网关在工业行业的应用案例

物联网网关在工业行业的应用案例 随着物联网技术的不断发展&#xff0c;物联网网关在工业行业的应用越来越广泛。本文将介绍一个物联网网关在工业行业的应用案例&#xff0c;以期为相关领域的研究和实践提供借鉴和启示。 一、案例背景 某大型制造企业是一家全球知名的汽车制…

高防IP是什么,高防IP有什么作用?

什么是高防IP&#xff1f; 高防IP是一款专业解决大流量攻击的安全防护产品&#xff0c;支持网站和非网站类业务的DDoS、CC防护&#xff0c;用户通过配置转发规则&#xff0c;将攻击流量引至高防IP并清洗&#xff0c;保障业务稳定可用&#xff0c;具有灾备能力&#xff0c;线路…

剑指offer --- 用两个栈实现队列的先进先出特性

目录 前言 一、读懂题目 二、思路分析 三、代码呈现 总结 前言 当我们需要实现队列的先进先出特性时&#xff0c;可以使用栈来模拟队列的行为。本文将介绍如何使用两个栈来实现队列&#xff0c;并给出具体的思路和代码实现。 一、读懂题目 题目&#xff1a;用两个栈实现一…

[ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧

文章目录 一、Amazon CodeWhisperer 简介1.1 CodeWhisperer 是什么1.2 Amazon CodeWhisperer 是如何工作的 二、Amazon CodeWhisperer 的优势和功能2.1 Amazon CodeWhisperer 的优势2.2 Amazon CodeWhisperer 的代码功能 三、Amazon CodeWhisperer 安装3.1 安装到 IntelliJ IDE…

计算数组中每个元素的立方根numpy.cbrt()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 计算数组中每个元素的立方根 numpy.cbrt() [太阳]选择题 请问以下代码中执行语句输出结果是&#xff1f; import numpy as np a np.array([1, 8, 27]) print("【显示】a ",a) pr…

synchronized jvm实现思考

底层实现时&#xff0c;为什么使用了cxq队列和entryList双向链表&#xff1f;这里为什么不跟AQS中使用一个队列就行了&#xff0c;加了一个entryList的目的是为了什么&#xff1f; 个人理解这里多一个entryList&#xff0c;可能是用于减少频繁的cas操作。假设存在很多锁竞争时&…

python pip

python pip 查看pip 版本:pip --version rootheihei:~# pip --version pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)查看已安装的python库: pip list rootheihei:~# pip list kiwisolver (1.1.0) matplotlib (2.2.5) networkx (2.2) numpy (1.16.6) openp…

【Linux】gcc/g++ gdb 使用

目录 1&#xff0c;背景知识 2&#xff0c;gcc 如何完成 1&#xff0c;预处理(进行宏替换) 2&#xff0c;编译&#xff08;生成汇编&#xff09; 3&#xff0c;汇编&#xff08;生成机器可识别代码&#xff09; 4&#xff0c;连接&#xff08;生成可执行文件或库文件&…