Linux三剑客:awk的高级用法

目录

awk高级用法

awk控制语句—if-else判断

awk控制语句—while循环

awk控制语句—do-while循环

awk控制语句—for循环

shell脚本中较相似的控制语句

break和continue

next

awk数组

awk自定义函数

awk中调用shell 命令


这一篇主要介绍awk的高级用法,因为awk可以单独作为一门语言来使用,所以它有很多高级用法

awk高级用法

awk控制语句—if-else判断

(1)语法

if(condition){statement;…}[else statement]  双分支
if(condition1){statement1}else if(condition2){statement2}else{statement3}  多分支

(2)使用场景:对awk 取得的整行或某个字段做条件判断

(3)演示

演示文本awkdemo内容:

hello:world
linux:redhat:lalala:hahaha
along:love:youou

---打印出了如果/etc/passwd下的第三个字段即uid大于3小于1000的第1列和第3列 

[root@centos111 test]# awk -F: '{if($3>10 &&$3<1000)print $1,$3}' /etc/passwd
operator 11
games 12
...

---打印出如果最后一列是"bin/bash"的则打印出第一列和最后一列 

[root@centos111 test]# awk -F: '{if($NF=="/bin/bash")print $1,$NF}' /etc/passwd
root /bin/bash
amandabackup /bin/bash
user /bin/bash
user1 /bin/bash
user2 /bin/bash

---输出总列数大于3的行 

[root@centos111 test]# awk -F: '{if(NF>3) print $0}' awkdemo 
linux:redhat:lalala:hahaha

---第3列>=1000为Common user,反之是root or Sysuser 

[root@centos111 test]# awk -F: '{if($3>=1000){printf "Conmmon user:%s\n",$1} else{printf "root or Sysuser:%s\n",$1}}' /etc/passwd
root or Sysuser:root
...
Conmmon user:nfsnobody
...

 ---磁盘利用率超过40的设备名和利用率

[root@centos111 test]# df -h|awk -F% '/^\/dev/{print $1}'|awk '$NF > 40{print $1,$NF}'
/dev/mapper/centos-root 56

---test=100和>90为very good; 90>test>60为good; test<60为no pass 

[root@centos111 test]# awk 'BEGIN{ test=100;if(test>90){print "very good"}else if(test>60){ print "good"}else{print "no pass"}}'
very good[root@centos111 test]# awk 'BEGIN{ test=80;if(test>90){print "very good"}else if(test>60){ print "good"}else{print "no pass"}}'
good[root@centos111 test]# awk 'BEGIN{ test=50;if(test>90){print "very good"}else if(test>60){ print "good"}else{print "no pass"}}'
no pass

awk控制语句—while循环

(1)语法

while``(condition){statement;…}

注:条件“真”,进入循环;条件“假”, 退出循环

(2)使用场景

  对一行内的多个字段逐一类似处理时使用

  对数组中的各元素逐一处理时使用

(3)演示

---以along开头的行,以:为分隔,显示每一行的每个单词和其长度

[root@centos111 test]#  awk -F: '/^along/{i=1;while(i<=NF){print $i,length($i); i++}}' awkdemo
along 5
love 4
youou 5

---以:为分隔,显示每一行的长度大于6的单词和其长度 

[root@centos111 test]# awk -F: '{i=1;while(i<=NF) {if(length($i)>=6){print $i,length($i)}; i++}}' awkdemo
redhat 6
lalala 6
hahaha 6

---计算1+2+3+...+100=5050

[root@centos111 test]# awk 'BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};print sum}' 5050
5050

awk控制语句—do-while循环

1)语法

do` `{statement;…}``while``(condition)

意义:无论真假,至少执行一次循环体

(2)计算1+2+3+...+100=5050

[root@centos111 test]# awk 'BEGIN{sum=0;i=1;do{sum+=i;i++}while(i<=100);print sum}'
5050

awk控制语句—for循环

(1)语法

for``(expr1;expr2;expr3) {statement;…}

(2)特殊用法:遍历数组中的元素

for``(var ``in` `array) {``for``-body}

(3)演示

---显示每一行的每个单词和其长度

[root@centos111 test]# awk -F: '{for(i=1;i<NF;i++){print$i,length($i)}}' awkdemo 
hello 5
linux 5
redhat 6
lalala 6
along 5
love 4
//NF表示字段数量,

---求男m、女各自的平均

[root@along ~]# cat sort.txt
xiaoming m 90
xiaohong f 93
xiaohei m 80
xiaofang f 99
[root@centos111 test]# awk '{m[$2]++;score[$2]+=$3}END{for(i in m) {printf "%s:%6.2f\n",i,score[i]/m[i]}}' sort.txt 
m: 85.00
f: 96.00

shell脚本中较相似的控制语句

break和continue

---奇数相加
[root@centos111 test]# awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}'
2500---1+2+...+66
[root@centos111 test]# awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i==66)break;sum+=i}print sum}'
2145---奇数相加``
[root@centos111 test]# awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}'
2500---1+2+...+66``
[root@centos111 test]# awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i==66)break;sum+=i}print sum}'
2145

next

next:提前结束对本行处理而直接进入下一行处理(awk 自身循环)

---只打印偶数行

[root@centos111 test]# awk -F: '{if(NR%2!=0) next; print $1,$3}' /etc/passwd
bin 1
adm 3
...

awk数组

关联数组:array[index-expression]

(1)可使用任意字符串;字符串要使用双引号括起来

(2)如果某数组元素事先不存在,在引用时,awk 会自动创建此元素,并将其值初始化为“空串”

(3)若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历

(4)若要遍历数组中的每个元素,要使用for 循环:for(var in array) {for-body}

演示

[root@centos111 test]# cat awkdemo2
aaa
bbbb
aaa
123
123
123

---去除重复的行

[root@centos111 test]# awk '!arr[$0]++' awkdemo2
aaa
bbbb
123

---打印文件内容,和该行重复第几次出现

[root@centos111 test]# awk '{!arr[$0]++;print $0,arr[$0]}' awkdemo2
aaa 1
bbbb 1
aaa 2
123 1
123 2
123 3

分析:把每行作为下标,第一次进来,相当于print ias...一样结果为空,打印空,!取反结果为1,打印本行,并且++变为不空,下次进来相同的行就是相同的下标,本来上次的值,!取反为空,不打印,++变为不空,所以每次重复进来的行都不打印

(2)数组遍历

[root@centos111 test]# awk 'BEGIN{abc["ceo"]="along";abc["coo"]="mayun";abc["cto"]="mahuateng";for(i in abc){print i,abc[i]}}'coo mayun
ceo along
cto mahuateng
[root@centos111 test]#  awk '{for(i=1;i<=NF;i++)abc[$i]++}END{for(j in abc)print j,abc[j]}' awkdemo2
aaa 2
bbbb 1
123 3

数值\字符串处理

(1)数值处理

  • rand():返回0和1之间一个随机数,需有个种子 srand(),没有种子,一直输出0.237788

演示:

[root@centos111 test]# awk 'BEGIN{print rand()}' 
0.237788
[root@centos111 test]# awk 'BEGIN{srand();print rand()}' 
0.973507
[root@centos111 test]# awk 'BEGIN{srand();print rand()}' 
0.70811
---取0-50随机数
[root@centos111 test]# awk 'BEGIN{srand();print int(rand()*100%50)+1}' 
4
[root@centos111 test]# awk 'BEGIN{srand();print int(rand()*100%50)+1}' 
28

(2)字符串处理:

  • length([s]) :返回指定字符串的长度

  • sub(r,s,[t]) :对t 字符串进行搜索r 表示的模式匹配的内容,并将第一个匹配的内容替换为s

  • gsub(r,s,[t]) :对t 字符串进行搜索r 表示的模式匹配的内容,并全部替换为s 所表示的内容

  • plit(s,array,[r]) :以r 为分隔符,切割字符串s ,并将切割后的结果保存至array 所表示的数组中,第一个索引值为1, 第二个索引值为2,…

演示:

[root@centos111 test]# echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)'
2008-08:08 08:08:08
//搜索第一个值然后替换
[root@centos111 test]# echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$1)'
2008-08-08 08:08:08
搜索所有的值进行替换
[root@centos111 test]# echo "2008:08:08 08:08:08" | awk '{split($0,i,":")}END{for(n in i){print n,i[n]}}'
4 08
5 08
1 2008
2 08
3 08 08

awk自定义函数

(1)格式:和bash区别:定义函数()中需加参数,return返回值不是$?,是相当于echo输出

function name ( parameter, parameter, ... ) {statementsreturn expression
}

(2)演示

[root@centos111 test]# cat fun.awk 
function max(v1,v2) {v1>v2?var=v1:var=v2return var
}
BEGIN{a=3;b=2;print max(a,b)}
[root@centos111 test]# awk -f fun.awk 
3

awk中调用shell 命令

(1)system 命令

  空格是awk 中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk 的变量外其他一律用"" 引用 起来。

[root@centos111 test]# awk BEGIN'{system("hostname")}'
centos111

(2)向awk脚本传递参数

① 格式:

awkfile var=value var2=value2... Inputfile

注意 :在BEGIN 过程 中不可用。直到 首行输入完成以后,变量才可用 。可以通过-v 参数,让awk 在执行BEGIN 之前得到变量的值。命令行中每一个指定的变量都需要一个-v

② 示例

[root@centos111 test]# cat test.awk
#!/bin/awk -f
{if($3 >=min && $3<=max)print $1,$3}
[root@centos111 test]# chmod +x test.awk
[root@centos111 test]# ./test.awk -F: min=100 max=200 /etc/passwd
systemd-network 192

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

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

相关文章

Qt遇到常见问题记录

1.Qt版本选择 Qt4.8.7是Qt4的终结版本&#xff0c;是Qt4系列版本中最稳定最经典的 &#xff08;很多嵌入式板子还是用Qt4.8&#xff09;&#xff0c;其实该版本是和Qt5.5差不多时间发布的。 参考链接 Qt 5.5 Released Qt5.6.3最最后支持xp系统的长期支持版本&#xff0c;Q…

Python | 机器学习之SVM支持向量机

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《人工智能奇遇记》&#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 目录结构 1. 机器学习之SVM支持向量机概念 1.1 机器学习 1.2 SVM支持向量机 2. SVM支持向量机…

vscode代码上传到gitlab

打开终端 1.1输入一下内容提交到本地仓库 PS D:\VueProject2\mall-admin-web> git add . PS D:\VueProject2\mall-admin-web> git commit -m “商品优化&#xff0c;屏蔽不要内容” 1.2提交到远程仓库 master应该被替换为 Gitee 仓库中默认的分支名称 PS D:\VueProje…

jenkins 使用原生 git clone 命令,指定ssh密钥文件

使用环境变量 GIT_SSH_COMMAND 从Git版本2.3.0可以使用环境变量GIT_SSH_COMMAND&#xff0c;如下所示&#xff1a; GIT_SSH_COMMAND"ssh -i ~/.ssh/id_rsa_example" git clone example请注意&#xff0c;-i有时可以被您的配置文件覆盖&#xff0c;在这种情况下&…

快速弄懂C++中的智能指针

智能指针是C中的一个对象&#xff0c;它的行为类似于指针&#xff0c;但它提供了自动的内存管理功能。当智能指针超出作用域时&#xff08;比如说在函数中使用智能指针指向了一个对象&#xff0c;当该函数结束时会自动销毁该对象&#xff09;&#xff0c;它会自动删除其所指向的…

合并word中参考文献-(Endnote生成)

合并word中的 两部分的参考文献引用 Merge Citations in the Word document Original&#xff1a; A is a big character [78-80] and B is another one [81-85] Modified&#xff1a; A and B are big characters [78-85] Solutions&#xff1a; Remove the space betwee…

蓝桥杯 第 3 场算法双周赛4,7题

迷宫逃脱 一眼数字三角形模型&#xff0c;因为是要求最大值&#xff0c;而且对转移状态有限制&#xff0c;所以需要注意dp状态的初始化&#xff0c;可以将所有状态赋值为-0x7f&#xff0c;然后将dp[0][1]和dp[1][0]初始化为0&#xff0c;又因为考虑到起始点a[1][1]&#xff0c…

AWD比赛中的一些防护思路技巧

## 思路1&#xff1a; 1、改服务器密码 &#xff08;1&#xff09;linux&#xff1a;passwd &#xff08;2&#xff09;如果是root删除可登录用户&#xff1a;cat /etc/passwd | grep bash userdel -r 用户名 &#xff08;3&#xff09;mysql&#xff1a;update mysql.user set…

前端分页实现

定义每页显示的数据数量&#xff08;例如每页显示10条数据&#xff09;。 根据总数据量和每页显示的数量计算出总页数。 给定当前页码&#xff0c;计算出当前页数据在左侧数据中的起始索引和结束索引。 使用起始索引和结束索引&#xff0c;从左侧数据中截取出当前页的数据。…

ROS服务(Service)通信:通信模型、Hello World与拓展

服务通讯是基于请求响应模式的&#xff0c;是一种应答机制。 用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输场景。 一、服务通讯模型 服务是一种双向通讯方式&#xff0c;它通过请求和应答的方式传递消息&#xff0c;该模型涉及到三个角色&#xff1a; Master…

vscode中Chinese (Simplified)汉化无效解决方法

问题复现 之前已经下载了 Chinese (Simplified)插件并启用了&#xff0c;都是正常的中文简体。有时候打开vscode的时候&#xff0c;会发现汉化失效了&#xff0c;如图&#xff1a; 解决方法 依次点击 扩展&#xff08;Extensions&#xff09;— Chinese (Simplified) — 选…

独立服务器应该怎么选择?

选择适合你的独立服务器方案是确保在线业务成功的关键步骤。以下是一些你需要考虑的因素&#xff1a; 1. 选择合适的主机商&#xff1a;在选择独立服务器的项目中&#xff0c;我们更注重商家的信誉和品牌&#xff0c;因为一个好的商家必须提供质量保证的产品。 2. 选择服务器…

【案例】可视化大屏

人狠话不多,直接上效果图 这里放的地图自己去实现吧,如果也想实现3D地球话,等笔者那天有心情写篇文章; 说明:script中methods部分代码是没用,可以直接删掉,根据个人情况去写, 内容:笔者也就对页面布局进行了设计,内容的填充就靠个人了 <template><div :sty…

Union(联合体、共用体)

结构体和共用体的区别在于&#xff1a;结构体的各个成员会占用不同的内存&#xff0c;互相之间没有影响&#xff1b;而共用体的所有成员占用同一段内存&#xff0c;修改一个成员会影响其余所有成员。 结构体占用的内存大于等于所有成员占用的内存的总和&#xff08;成员之间可能…

三十分钟学会zookeeper

zookeeper 一、前提知识 集群与分布式 ​ 集群&#xff1a;将一个任务部署在多个服务器&#xff0c;每个服务器都能独立完成该任务。 ​ 分布式&#xff1a;将一个任务拆分成若干个子任务&#xff0c;由若干个服务器分别完成这些子任务&#xff0c;每个服务器只能完成某个特…

Python代码运行速度提升技巧!Python远比你想象中的快~

文章目录 前言一、使用内置函数二、字符串连接 VS join()三、创建列表和字典的方式四、使用 f-Strings五、使用Comprehensions六、附录- Python中的内置函数总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项…

Android Studio Error “Unsupported class file major version 61“---异常信息记录

编译时异常信息 原因及解决办法 问题出在JAVA 17上&#xff0c;并且使用的Gradle JDK是&#xff1a;Android Studio java home版本17.0.1将其更改为&#xff1a;Android Studio默认JDK版本11.0.10 即可解决 操作步骤 1 2 3

“Cloud“(云)

"Cloud"&#xff08;云&#xff09;通常指的是云计算&#xff08;cloud computing&#xff09;&#xff0c;是一种通过互联网提供计算服务的模型。云计算允许用户通过网络访问和使用计算资源&#xff0c;而无需拥有或管理实际的硬件和软件基础设施。这种模型提供了一…

pycharm/vscode 配置black和isort

Pycharm blackd Pycharm中有插件可以实现后台服务运行black&#xff1a;BlackConnect 安装 在python中安装blackd 配置 Pycharm isort pycharm中&#xff0c;isort没有插件&#xff0c;暂使用外部工具实现&#xff0c;外部工具也可添加快捷键实现快捷对文件、文件夹进行fo…

代码执行相关函数以及简单例题

代码/命令 执行系列 相关函数 &#xff08;代码注入&#xff09;