28-Linux-AWK使用范例
awk使用范例
原文件内容:[root@CentOS8 data]# cat emp.txt Beth:4.00:0Dan:3.75:0kathy:4.00:10Mark:5.00:20Mary:5.50:22Susie:4.25:18
以 :为分隔符搜索 emp.txt 文件中每行的 1,3字段,且打印至终端时在其中间以 tab键为字段分隔符来显示[root@CentOS8 data]# awk -F":" '{print $1"\t"$3}' emp.txt Beth 0Dan 0kathy 10Mark 20Mary 22Susie 18
与-F作用相同的写法 -v FS=[root@CentOS8 data]# awk -v FS=":" '{print $1"\t"$3}' emp.txt Beth 0Dan 0kathy 10Mark 20Mary 22Susie 18
指定 tab键 为字段分隔符显示 emp.txt 文件的1,3字段 OFS[root@CentOS8 data]# awk -v OFS="\t" -F":" '{print $1,$3}' emp.txt Beth 0Dan 0kathy 10Mark 20Mary 22Susie 18
同样也可以这样写:应注意有两个 -v[root@CentOS8 data]# awk -v FS=':' -v OFS='\t' '{print $1,$3}' emp.txt Beth 0Dan 0kathy 10Mark 20Mary 22Susie 18
另外,还可以输入记录分隔符,指定输入时的换行符例如:以 ;为记录分隔符,只要遇到 ;就将 ;换成\n换行应注意原文件每行结尾都有一个隐藏的\n换行符,输出结果仍将\n换行符视为某行的一部分[root@CentOS8 data]# cat file.txtstudent;limingtech;wang;ma[root@CentOS8 data]# awk -v RS=';' '{print}' file.txt studentlimingtechwangma
那么如何证明这一点呢?输出行号一共为4行[root@CentOS8 data]# awk -v RS=';' '{print NR}' file.txt 1234而之前的输出字符似乎是五行 :[root@CentOS8 data]# awk -v RS=';' '{print}' file.txt studentlimingtechwangma结论证明:NR为显示行号,$0是显示每一行;意思是输出每一行并为其添加行号[root@CentOS8 data]# awk -v RS=';' '{print $0,NR}'le.txt student 1limingtech 2wang 3ma4所以第一行的liming \n tech三者被视为同一新行,此外,ma后面依旧有一个隐藏的\n换行符
使用ORS输出记录分隔符,输出时用指定符号代替换行符 只要遇到 ;就将其替换成@@@输出若RS不指定,默认将行尾隐藏的\n换行符替换[root@CentOS8 data]# awk -v RS=';' -v ORS='@@@' '{print $0}' file.txtstudent@@@limingtech@@@wang@@@ma@@@
还可以使用NF来显示每一行的字段个数[root@CentOS8 data]# awk -v RS=';' '{print NF}' file.txt 1211
当然,如果不添加额外的选项,仅显示原文件的话,此时只有两行,如果该行中没有空格分隔字段,那么该行会被视为一个整体 即:一个字段[root@CentOS8 data]# awk '{print NF}' file.txt 11
取出磁盘最大使用率[root@CentOS8 data]# df -h|grep 'dev/sd'|awk -F% '{print $1}'|awk '{print $5}'|sort -n|tail -113
另一种写法[root@CentOS8 data]# df -h|awk -F" +|%" '$0 ~ /^\/dev\/sd/{print $5}'|sort -n|tail -113
-F 指明输入时选定的字段分隔符-v Var=value变量赋值FS 输入字段分隔符,默认为空格OFS 输出字段分隔符,默认为空格RS 输入记录分隔符,指定输入时的换行符ORS 输出记录分隔符,输出时用指定符号代替换行符 NF 显示字段数量NR 记录每行行号
除了处理一个文件,是不是可以处理多个文件呢?同时分别显示两个文件的行号[root@CentOS8 data]# cat file.txt student;limingtech;wang;ma[root@CentOS8 data]# cat emp.txt Beth:90:oneDan:110:two[root@CentOS8 data]# awk '{print FNR}' file.txt emp.txt 1212[root@CentOS8 data]# awk '{print $0,FNR}' file.txt emp.txt student;liming 1tech;wang;ma 2Beth:90:one 1Dan:110:two 2
另外还有其他有意思的选项有关NR、NF变量的使用在以前我们曾尝试用各种基础命令来取出IP地址、磁盘利用率、软件版本类型等等如此之类的需求;而awk可以非常便捷的做到 :取出磁盘利用率最大的分区[root@CentOS8 data]# df -h|awk -F" +|%" '$0~"/dev/sda"{print $5}'|sort -n|tail -113
取出用户的家目录[root@CentOS8 data]# awk -F: '{print $(NF-1)}' /etc/passwd/root/bin…………./home/td/home/mage
取出主机ip[root@CentOS8 data]# ifconfig ens33|awk NR==2'{print $NR}'192.168.124.3
有关FILENAME的使用文件内容全部替换成文件名,即输出文件个数=文件行数[root@CentOS8 data]# awk '{print FILENAME}' file.txt file.txt file.txt[root@CentOS8 data]# awk '{print FILENAME}' emp.txt emp.txtemp.txt[root@CentOS8 data]# awk '{print FNR,FILENAME}' emp.txt file.txt 1 emp.txt2 emp.txt1 file.txt2 file.txt
?awk还可以加减乘除?[root@CentOS8 data]# awk 'BEGIN{print 3*5}'15[root@CentOS8 data]# awk 'BEGIN{print (2*5-6)/2^2}'1
显示命令行参数的个数[root@CentOS8 data]# awk 'BEGIN{print ARGC}' 1[root@CentOS8 data]# awk 'BEGIN{print ARGC}' emp.txt 2[root@CentOS8 data]# awk 'BEGIN{print ARGC}' emp.txt file.txt 3[root@CentOS8 data]# awk 'BEGIN{print ARGC}' emp.txt file.txt pig.txt 4
ARGV:数组[root@CentOS8 data]# awk 'BEGIN{print ARGV[0]}' emp.txt file.txt pig.txt awk[root@CentOS8 data]# awk 'BEGIN{print ARGV[1]}' emp.txt file.txt pig.txt emp.txt[root@CentOS8 data]# awk 'BEGIN{print ARGV[2]}' emp.txt file.txt pig.txt file.txt[root@CentOS8 data]# awk 'BEGIN{print ARGV[3]}' emp.txt file.txt pig.txt pig.txt
FNR 分别记录多个文件行号FILENAME 当前文件名ARGC 终端输入时命令行参数的个数BEGIN 加减乘除等运算ARGV 数组,命令行的各个参数
除了可以使用awk的内置变量,还可以自定义变量[root@CentOS8 data]# awk -F: -v user="username : " '{print user$1}' /etc/passwdusername : rootusername : binusername : daemonusername : adm……………………………
自定义多个变量[root@CentOS8 data]# awk -F: -v user="username : " -v usid="useruid : " -v ugid= :" usergid " '{print user$1"\t"usid$3"\t"ugid$4}' /etc/passwdusername : root useruid : 0 usergid :0username : bin useruid : 1 usergid :1username : daemon useruid : 2 usergid :2username : adm useruid : 3 usergid :4……………………………………
也可以将变量定义在program中[root@CentOS8 data]# awk -F: '{user="username : ";usid="useruid : ";ugid=" usergid :";print user$1"\t"usid$3"\t"ugid$4}' /etc/passwdusername : root useruid : 0 usergid :0username : bin useruid : 1 usergid :1username : daemon useruid : 2 usergid :2username : adm useruid : 3 usergid :4………………………………………………
倘若你已经在shell中定义过要使用的变量,同样在awk中你也可以调用它[root@CentOS8 data]# user="username:" uuid="useruid:" ugid="usergid:";awk -F: -v i=$user -v u=$uuid -v g=$ugid '{print i$1"\t"u$3"\t"g$4}' /etc/passwdusername:root useruid:0 usergid:0username:bin useruid:1 usergid:1username:daemon useruid:2 usergid:2username:adm useruid:3 usergid:4…………………………………………
将执行的命令放在一个文件中,使用awk调用该文件一样OK[root@CentOS8 data]# vim awk.txt[root@CentOS8 data]# cat awk.txt {user="username : ";usid="useruid : ";ugid=" usergid ";print user$1"\t"usid$3"\t"ugid$4}[root@CentOS8 data]# awk -F: -f awk.txt /etc/passwdusername : root useruid : 0 usergid 0username : bin useruid : 1 usergid 1username : daemon useruid : 2 usergid 2username : adm useruid : 3 usergid 4………………………………
printf命令
格式化输出:printf “FORMAT”,item1,item2,….必须指定FORMAT不主动换行,需手动给出\n换行符FORMAT中需要分别为后面每个item指定格式符
格式符:与item相呼应%c:显示字符的ASCII码(不常用)%d,%i:显示十进制整数(常用)%e,%E:显示科学计数法数值%f:显示为浮点数(小数位)%g,%G:以科学计数法或浮点形式显示数值(也许你需要将小数精确至0.001什么的)%s:显示字符串%u:无符号整数%%:显示%自身
修饰符:#[.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度 %3.1f- 左对齐(默认为右对齐)%-15s+ 显示数值的正负号 %+d
默认向右对其显示[root@CentOS8 data]# cat emp.txt Beth:-90:233:-12:seur:outDan:110:-7:66:root[root@CentOS8 data]# awk -F: '{printf "%4s %10d %5d\n",$1,$3,$4}' emp.txtBeth 233 -12Dan -7 66
加-左对齐[root@CentOS8 data]# awk -F: '{printf "%-4s %-10d %d\n",$1,$3,$4}' emp.txtBeth 233 -12Dan -7 66
显示’数值‘的正负[root@CentOS8 data]# awk -F: '{printf "%-5s %5+d %5+d\n",$1,$3,$4}' emp.txt Beth +233 -12Dan -7 +66
之前操作的示例中有计算加减乘除的展示那么,awk中的算术操作符以及其他的操作符有哪些:
x+y 加法
x-y 减法
x*y 乘法
x/y 除法
x^y 幂运算(指数)
x%y 取模(除余)
-x 转换成负数
+x 将字符串转换为数值赋值操作符:= 右边赋值给左边
+= 先加,再赋值
-= 先减,再赋值
*= 先乘,再赋值
/= 先除,再赋值
%= 先取模,再赋值
^= 先幂运算,再赋值
++ 递增操作
-- 递减操作比较操作符:== 判断相等
!= 判断不等
\> 判断大于
\>= 判断大于等于
< 判断小于
<= 判断小于等于模式匹配符:~ 左边是否和右边匹配包含
!~ 是否不匹配逻辑操作符:&& 逻辑与
|| 逻辑或
! 逻辑非
比较下列两个命令语句有何区别[root@CentOS8 data]# awk 'BEGIN{i=0;print ++i,i}'[root@CentOS8 data]# awk 'BEGIN{i=0;print i++,i}'
第一个是先加,之后将加得的数和i打印第二个是先打印i的值,再将i加得的数打印[root@CentOS8 data]# awk 'BEGIN{i=0;print ++i,i}'1 1[root@CentOS8 data]# awk 'BEGIN{i=0;print i++,i}'0 1
awk中的PATTERN模式
PATTERN:根据pattern条件,过滤匹配的行;然后再做处理1:若pattern未指定:视为空模式,匹配所有行2:/relational expression/:仅处理能够被模式匹配到的行,且需要用//扩入3:relational expression:关系表达式,仅结果为真,才会进行处理真:结果为非0值,非空字符串都为真假:结果为空字符串或0值都为4:line ranges:行范围startine,endline:/pat1/,/pat2/不支持直接给出数字格式。5:BEGIN/END模式BEGIN{}:仅在开始处理文件中的文本之前执行一次END{}:仅在文本处理完成之后执行一次。
匹配/etc/passwd 中所有行的第N个字段所在的那行包含root的[root@CentOS8 data]# awk -F: '$0 ~ /root/{print $1}' /etc/passwdrootoperator
当然,如果匹配一个不存在的字符串是没有反应的[root@CentOS8 data]# awk -F: '$0 ~ /kxxxla/{print $1}' /etc/passwd[root@CentOS8 data]# awk -F: '$0 ~ /root/{print $3}' /etc/passwd011[root@CentOS8 data]# awk -F: '$0 ~ /root/{print $5}' /etc/passwdrootoperator
查看/etc/passwd文件便可清楚了解[root@CentOS8 data]# cat /etc/passwdroot:x:0:0:root:/root:/bin/bash………………………………….operator:x:11:0:operator:/root:/sbin/nologin
匹配/etc/passwd 中所有行的第N个字段所在的那行为0的[root@CentOS8 data]# awk -F: '$4==0' /etc/passwdroot:x:0:0:root:/root:/bin/bashsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltoperator:x:11:0:operator:/root:/sbin/nologin[root@CentOS8 data]# awk -F: '$3==0' /etc/passwdroot:x:0:0:root:/root:/bin/bash
于此之外,使用!~可以匹配相反的效果[root@CentOS8 data]# awk -F: '!$4==0' /etc/passwdbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
匹配/etc/passwd 中所有行的第N个字段所在的那行为非0的[root@CentOS8 data]# awk -F: '!$4==0' /etc/passwdbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin…………………………………..过多不做演示
匹配/etc/passwd 中所有行的第N个字段所在的那行不包含root的[root@CentOS8 data]# awkawk -F: '$0 !~ /root/{print $5}' tc/passwdbindaemonadm………..过多不做演示
有关逻辑与或非的示例:匹配/etc/passwd中所有行的第三字段数值在0-5之间的,打印符合条件的行的第一字段[root@CentOS8 data]# awk -F: '$3>=0 && $3<=5 {print $1}' /etc/passwd|tr '\n' ' 'root bin daemon adm lp sync
匹配/etc/passwd中所有行的第三字段的数值在小于等于0或大于等于1000之间的,打印符合条件的行的第一字段[root@CentOS8 data]# awk -F: '$3<=0 || $3>=1000 {print $1}' /etc/passwdrootnobodytd
匹配/etc/passwd中所有行的第三字段数值在小于1000的,取反变为大于等于1000的,打印符合条件的行的第一字段[root@CentOS8 data]# awk -F: '!($3<1000) {print $1}' /etc/passwdnobodytd
有关PATTERN模式的示例:原文件:
[root@CentOS8 data]# cat /etc/fstab #
# /etc/fstab
# Created by anaconda on Wed Sep 25 20:03:53 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=e2e0f44d-0ae9-4159-a99f-6a1c72dcccbe / xfs defaults 0 0
UUID=deb9638d-76ba-4370-90f1-962cd4ab55b5 /boot ext4 defaults 1 2
UUID=40aac826-ee18-4927-8574-c8618c4ea1e7 /data xfs defaults 0 0
UUID=d12cdea2-cb68-4aa7-97cd-9002297faf05 swap swap defaults 0 0
仅匹显示以UUID开头的行[root@CentOS8 data]# awk '/^UUID/{print $1}' /etc/fstab UUID=e2e0f44d-0ae9-4159-a99f-6a1c72dcccbeUUID=deb9638d-76ba-4370-90f1-962cd4ab55b5UUID=40aac826-ee18-4927-8574-c8618c4ea1e7UUID=d12cdea2-cb68-4aa7-97cd-9002297faf05
取反
[root@CentOS8 data]# awk '!/^UUID/{print $0}' /etc/fstab #
# /etc/fstab
# Created by anaconda on Wed Sep 25 20:03:53 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
Relational expression:关系表达式[root@CentOS8 data]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwdroot /bin/bashtd /bin/bashmage /bin/bash
28-Linux-AWK使用范例相关推荐
- linux awk命令详解,使用system来内嵌系统命令,批量github,批量批下载视频, awk合并两列...
linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...
- 在Linux里awk与sed的区别,linux awk和sed讲解
sed 工具简介 在了解了一些正规表示法的基础应用之后,再来呢?呵呵-两个东西可以玩一玩的,那就是 sed 跟 awk 了! 这两个家伙可是相当的有用的啊!举例来说,鸟哥写的 logfile.sh 分 ...
- linux awk语法格式,Awk是什么?一文带运维小白快速掌握Linux Awk用法
原标题:Awk是什么?一文带运维小白快速掌握Linux Awk用法 作者:a8 Awk.sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以 ...
- 文本处理利器Linux Awk这样入门☛常见变量的使用
Linux awk常见变量初识案例 声明与简介 简介 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具.awk通常用来处理结构化(固定 ...
- Linux awk编辑器及命令
Linux awk编辑器及命令 一.awk编辑器 1.工作原理 2.命令格式 3.awk常见的内建变量如下所示: 二.按行输出文本 三.按字段输出文本 四.通过管道.双引号调用 Shell 命令 一. ...
- 按关键字截取linux日志,linux awk截取数据,如何根据第二部分数据的关键字‘aaaaa’获取整串数据...
linux awk截取数据,如何根据第二部分数据的关键字'aaaaa'获取整串数据 发布时间:2013-10-30 12:02:12来源:红联作者:qzq181490950 数据类似这样('dsfdd ...
- linux awk if 多个条件,linux shell awk 流程控制语句(if,for,while,do)详细介绍
在linux awk的 while.do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出.break中断当前正在执行的循环并跳到循环 ...
- linux awk 日志分析,Linux Awk使用案例总结 nginx日志统计
文章目录 [隐藏] 一.Nginx日志分析 知识点: 数组 数组是用来存储一系列值的变量,可通过索引来访问数组的值. Awk中数组称为关联数组,因为它的下标(索引)可以是数字也可以是字符串. 下标通常 ...
- linux awk菜鸟教程,Linux awk 命令
Linux awk 命令 AWK是一种处理文本文件的语言,是一个强大的文本分析工具. 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian K ...
- Linux --- awk
这里提到awk,相信写shell的朋友都会接触到.AWK 是一种用于处理文本的编程语言工具.AWK 提供了极其强大的功能: 可以进行正则表达式的匹配 样式装入 流控制 数学运算符 进程控制语句 内置的 ...
最新文章
- Android Studio 代码注释插入图片
- atomic原子类实现机制_Java并发包-atomic包-让您彻底掌握AtomicInteger源码
- Shiro框架:缓存、session会话、自定义FormAuthenticationFilter、RemenberMe
- Java有哪些从业方向?分享这9个
- CDN加速实现—varnish
- 阿里技术专家加多:Java异步编程实战之基于JDK中的Future实现异步编程
- 假设无线打印服务器,如何把对对机通过WiFi变成微信打印机??
- 51单片机三种烧录的方法介绍
- 手机数控模拟器安卓版_CNC模拟器安卓中文版
- Windows 7 系统封装文字版 精简教程笔记!
- 北理工-大二数据结构乐学编程题-约瑟夫问题、验证表、循环小数、综教楼后的坑...
- 中文版Excel 2007公式与函数应用宝典
- java解析dcm文件
- matlab 火柴人_小波分析检测信号奇异点matlab代码
- 决策树中使用网格搜索寻找最优参数
- 透视与3D(3D立方体)
- TortoiseSVN文件夹及文件图标不显示解决方法
- 文献阅读(77)稀疏跳零结构(1)
- C# winform 检测网络是否畅通 检测
- python软件编程培训
热门文章
- 泡芙噶的计算机网络(2)-紧张刺激的Wireshark实验
- Integrity check failed for “antd“ (computed integrity doesn‘t match our records
- python--真气网监测站点数据的抓取
- 如何兼顾隐私安全与便捷体验?华为浏览器集成FIDO,登录环境更安全
- Docker 三剑客-------docker swam,visualizer监控、stack部署集群、Portainer可视化
- 利用IDEA工具导入csv表格文件到数据库
- 软链接、硬链接与复制的区别
- “开心网”上出现网络中奖诈骗,提醒网友提防骗局
- 7条命令在docker中部署Mesos集群
- MATLAB定态氢原子波函数可视化