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使用范例相关推荐

  1. linux awk命令详解,使用system来内嵌系统命令,批量github,批量批下载视频, awk合并两列...

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  2. 在Linux里awk与sed的区别,linux awk和sed讲解

    sed 工具简介 在了解了一些正规表示法的基础应用之后,再来呢?呵呵-两个东西可以玩一玩的,那就是 sed 跟 awk 了! 这两个家伙可是相当的有用的啊!举例来说,鸟哥写的 logfile.sh 分 ...

  3. linux awk语法格式,Awk是什么?一文带运维小白快速掌握Linux Awk用法

    原标题:Awk是什么?一文带运维小白快速掌握Linux Awk用法 作者:a8 Awk.sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以 ...

  4. 文本处理利器Linux Awk这样入门☛常见变量的使用

                                Linux awk常见变量初识案例 声明与简介 简介 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具.awk通常用来处理结构化(固定 ...

  5. Linux awk编辑器及命令

    Linux awk编辑器及命令 一.awk编辑器 1.工作原理 2.命令格式 3.awk常见的内建变量如下所示: 二.按行输出文本 三.按字段输出文本 四.通过管道.双引号调用 Shell 命令 一. ...

  6. 按关键字截取linux日志,linux awk截取数据,如何根据第二部分数据的关键字‘aaaaa’获取整串数据...

    linux awk截取数据,如何根据第二部分数据的关键字'aaaaa'获取整串数据 发布时间:2013-10-30 12:02:12来源:红联作者:qzq181490950 数据类似这样('dsfdd ...

  7. linux awk if 多个条件,linux shell awk 流程控制语句(if,for,while,do)详细介绍

    在linux awk的 while.do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出.break中断当前正在执行的循环并跳到循环 ...

  8. linux awk 日志分析,Linux Awk使用案例总结 nginx日志统计

    文章目录 [隐藏] 一.Nginx日志分析 知识点: 数组 数组是用来存储一系列值的变量,可通过索引来访问数组的值. Awk中数组称为关联数组,因为它的下标(索引)可以是数字也可以是字符串. 下标通常 ...

  9. linux awk菜鸟教程,Linux awk 命令

    Linux awk 命令 AWK是一种处理文本文件的语言,是一个强大的文本分析工具. 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian K ...

  10. Linux --- awk

    这里提到awk,相信写shell的朋友都会接触到.AWK 是一种用于处理文本的编程语言工具.AWK 提供了极其强大的功能: 可以进行正则表达式的匹配 样式装入 流控制 数学运算符 进程控制语句 内置的 ...

最新文章

  1. Android Studio 代码注释插入图片
  2. atomic原子类实现机制_Java并发包-atomic包-让您彻底掌握AtomicInteger源码
  3. Shiro框架:缓存、session会话、自定义FormAuthenticationFilter、RemenberMe
  4. Java有哪些从业方向?分享这9个
  5. CDN加速实现—varnish
  6. 阿里技术专家加多:Java异步编程实战之基于JDK中的Future实现异步编程
  7. 假设无线打印服务器,如何把对对机通过WiFi变成微信打印机??
  8. 51单片机三种烧录的方法介绍
  9. 手机数控模拟器安卓版_CNC模拟器安卓中文版
  10. Windows 7 系统封装文字版 精简教程笔记!
  11. 北理工-大二数据结构乐学编程题-约瑟夫问题、验证表、循环小数、综教楼后的坑...
  12. 中文版Excel 2007公式与函数应用宝典
  13. java解析dcm文件
  14. matlab 火柴人_小波分析检测信号奇异点matlab代码
  15. 决策树中使用网格搜索寻找最优参数
  16. 透视与3D(3D立方体)
  17. TortoiseSVN文件夹及文件图标不显示解决方法
  18. 文献阅读(77)稀疏跳零结构(1)
  19. C# winform 检测网络是否畅通 检测
  20. python软件编程培训

热门文章

  1. 泡芙噶的计算机网络(2)-紧张刺激的Wireshark实验
  2. Integrity check failed for “antd“ (computed integrity doesn‘t match our records
  3. python--真气网监测站点数据的抓取
  4. 如何兼顾隐私安全与便捷体验?华为浏览器集成FIDO,登录环境更安全
  5. Docker 三剑客-------docker swam,visualizer监控、stack部署集群、Portainer可视化
  6. 利用IDEA工具导入csv表格文件到数据库
  7. 软链接、硬链接与复制的区别
  8. “开心网”上出现网络中奖诈骗,提醒网友提防骗局
  9. 7条命令在docker中部署Mesos集群
  10. MATLAB定态氢原子波函数可视化