设为首页 收藏本站
查看: 1329|回复: 0

2.3.1.shell awk 入门

[复制链接]

尚未签到

发表于 2018-8-21 12:54:04 | 显示全部楼层 |阅读模式
  awk:好用的数据处理工具

  awk 也是一个非常棒的数据处理工具!sed 常常用于一整个行的处理, awk 则比较倾向于一行当中分成数个『栏位』(或者称为一个域,也就是一列)来处理。因此,awk 相当的适合处理小型的数据数据处理呢!awk 通常运行的模式是这样的:
[root@www ~]# awk '条件类型1{动作1} 条件类型2{动作2} ...' filename  awk 后面接两个单引号并加上大括号 {} 来配置想要对数据进行的处理动作。 awk 可以处理后续接的文件,也可以读取来自前个命令的 standard output 。 但如前面说的, awk 主要是处理『每一行的栏位内的数据』,而默认的『栏位的分隔符号为 "空白键" 或 "[tab]键" 』!举例来说,我们用 last 可以将登陆者的数据取出来,结果如下所示:
[root@www ~]# last -n 5  NR>=2{total=$2+$3+$4
  
> printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'
  
      Name        1st        2nd        3th      Total
  
     VBird      23000      24000      25000   72000.00
  
    DMTsai      21000      20000      23000   64000.00
  
     Bird2      43000      42000      41000  126000.00
  

  
     上面的例子有几个重要事项应该要先说明的:
  
awk 的命令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个命令辅助时,可利用分号『;』间隔, 或者直接以 [Enter] 按键来隔开每个命令,例如上面的范例中,鸟哥共按了三次 [enter] 喔!
  
逻辑运算当中,如果是『等於』的情况,则务必使用两个等号『==』!
  
格式化输出时,在 printf 的格式配置当中,务必加上 \n ,才能进行分行!
  
与 bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。
  
利用 awk 这个玩意儿,就可以帮我们处理很多日常工作了呢!真是好用的很~ 此外, awk 的输出格式当中,常常会以 printf 来辅助,所以, 最好你对 printf 也稍微熟悉一下比较好啦!另外, awk 的动作内 {} 也是支持 if (条件) 的喔! 举例来说,上面的命令可以修订成为这样:
  
[root@wuke shell]# cat pay.txt | \
  
> awk '{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
  
> NR>=2{total=$2+$3+$4
  
> printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'
  
      Name        1st        2nd        3th      Total
  
     VBird      23000      24000      25000   72000.00
  
    DMTsai      21000      20000      23000   64000.00
  
     Bird2      43000      42000      41000  126000.00
  你可以仔细的比对一下上面两个输入有啥不同~从中去了解两种语法吧!我个人是比较倾向於使用第一种语法, 因为会比较有统一性啊! ^_^
  学习了awk的基本知识,现在来做一些练习加深一下印象。
  假设我们有这样一个待处理的文件"grade.txt":
  M.Tansley     05/99     48311     Green     8     40     44
  J.Lulu     06/99     48317     green     9     24     26
  P.Bunny     02/99     48     Yellow     12     35     28
  J.Troll     07/99     4842     Brown-3     12     26     26
  L.Tansley     05/99     4712     Brown-2     12     30     28
  #打印整个文件
  [root@wuke shell]# awk '{print $0}' grade.txt
  M.Tansley     05/99     48311     Green     8     40     44
  J.Lulu     06/99     48317     green     9     24     26
  P.Bunny     02/99     48     Yellow     12     35     28
  J.Troll     07/99     4842     Brown-3     12     26     26
  L.Tansley     05/99     4712     Brown-2     12     30     28
  #打印第一和第四个域
  [root@wuke shell]# awk '{print $1,$4}' grade.txt
  M.Tansley Green
  J.Lulu green
  P.Bunny Yellow
  J.Troll Brown-3
  L.Tansley Brown-2
#打印表头  [root@wuke shell]# awk 'BEGIN{print "Name        Belt\n-----------------"}
  {print $1,$4}' grade.txt
  Name        Belt
  -----------------
  M.Tansley Green
  J.Lulu green
  P.Bunny Yellow
  J.Troll Brown-3
  L.Tansley Brown-2
  正则表达式相关
  为使一域号匹配正则表达式,使用符号‘~’后紧跟正则表达式,也可以用 i f语句。awk中if后面的条件用()括起来。
  #下面代码打印$4 包含 Brown 的行
  [root@wuke shell]# awk '$4~/Brown/{print $0}' grade.txt
  J.Troll     07/99     4842     Brown-3     12     26     26
  L.Tansley     05/99     4712     Brown-2     12     30     28
  #非精确匹配
  [root@wuke shell]# awk '$3~/48/{print $0}' grade.txt
  M.Tansley     05/99     48311     Green     8     40     44
  J.Lulu     06/99     48317     green     9     24     26
  P.Bunny     02/99     48     Yellow     12     35     28
  J.Troll     07/99     4842     Brown-3     12     26     26
  
  #精确匹配
  
  [root@wuke shell]# awk '$3=="48"{print $0}' grade.txt
  P.Bunny     02/99     48     Yellow     12     35     28
  
  #不匹配 使用 ‘!~’
  [root@wuke shell]# awk '$0!~/Brown/' grade.txt
  M.Tansley     05/99     48311     Green     8     40     44
  J.Lulu     06/99     48317     green     9     24     26
  P.Bunny     02/99     48     Yellow     12     35     28
  
  
  [root@wuke shell]# awk '$4!="Brown-2"{print$0}' grade.txt
  M.Tansley     05/99     48311     Green     8     40     44
  J.Lulu     06/99     48317     green     9     24     26
  P.Bunny     02/99     48     Yellow     12     35     28
  J.Troll     07/99     4842     Brown-3     12     26     26
  
  #小于
  [root@wuke shell]# awk '$6

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-554708-1-1.html 上篇帖子: Bash shell用户环境 下篇帖子: shell 编程高级技巧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表