博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
11.22 awk
阅读量:7220 次
发布时间:2019-06-29

本文共 1354 字,大约阅读时间需要 4 分钟。

hot3.png

9.6/9.7 awk

awk和sed是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行。awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的。

191525_KXpa_3716831.png

191655_DNkr_3716831.png

  • 截取文档中的某个段

223403_4qJg_3716831.png

解释一下,-F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符。 Print为打印的动作,用来打印出某个字段。$1为第一个字段,$2为第二个字段,依次类推,有一个特殊的那就是$0,它表示整行。

223512_p5iT_3716831.png

注意awk的格式,-F后紧跟单引号,然后里面为分隔符,print的动作要用 { } 括起来,否则会报错。print还可以打印自定义的内容,但是自定义的内容要用双引号括起来。

223724_rdO9_3716831.png

  • 匹配字符或字符串

跟sed很类似,不过还有比sed更强大的匹配。

083319_7uGY_3716831.png

可以让某个段去匹配,这里的’~’就是匹配的意思。

083435_dpGq_3716831.png

awk还可以多次匹配,如上例中匹配完root,再匹配test,它还可以只打印所匹配的段。

083618_WmFL_3716831.png

  • 条件操作符
[root@localhost ~]# awk -F ':' '$3=="0"' /etc/passwd

awk中是可以用逻辑符号判断的,比如 ‘==’ 就是等于,也可以理解为 ‘精确匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,值得注意的是,即使$3为数字,awk也不会把它当数字看待,它会认为是一个字符。所以不要妄图去拿$3当数字去和数字做比较。

084036_Pcx7_3716831.png

在上面的例子中,本想把pid大于等于500的行打印出,但是结果并不是我们的预期,这是因为awk把所有的数字当作字符来对待了,就跟上一章中提到的 sort 排序原理一样。

084144_M6V5_3716831.png

!= 为不匹配,除了针对某一个段的字符进行逻辑比较外,还可以两个段之间进行逻辑比较。

awk -F ':' '$3<$4' /etc/passwd

另外还可以使用 && 和 || 表示 “并且” 和 “或者” 的意思。

awk -F ':' '$3>"5" && $3<"7"' /etc/passwd

也可以是或者

awk -F ':' '$3>"5" || $7=="/bin/bash"' /etc/passwd
  • awk的内置变量

awk常用的变量有:

NF :用分隔符分隔后一共有多少段

NR :行数

084340_ireB_3716831.png

NF 是多少段,而$NF是最后一段的值, 而NR则是行号。

084441_ydbD_3716831.png

我们可以使用行号作为判断条件:

awk 'NR>20' /etc/passwd

也可以配合段匹配一起使用:

awk -F ':' 'NR>20 && $1 ~ /ssh/' /etc/passwd
  • awk中的数学运算

084647_LBDP_3716831.png

还可以计算某个段的总和

awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd

这里的END要注意一下,表示所有的行都已经执行,这是awk特有的语法,其实awk连同sed都可以写成一个脚本文件,而且有他们特有的语法,在awk中使用if判断、for循环都是可以的,不过日常管理工作中没有必要使用那么复杂的语句。

awk -F ':' '{if ($1=="root") print $0}' /etc/passwd

 

转载于:https://my.oschina.net/u/3716831/blog/1577017

你可能感兴趣的文章
IIS5.1使用虚拟目录部署网站
查看>>
Git 深度学习填坑之旅三(分支branch、远程操作)
查看>>
括号匹配问题
查看>>
UVA 10766 Organising the Organisation
查看>>
「美团 CodeM 复赛」城市网络
查看>>
python 将Excel表格中的一列数据转化成多行数据
查看>>
Go多线程与channel通信
查看>>
找水王
查看>>
多个线程之间共享数据的方式(卖票问题,存取款问题)
查看>>
观察者模式
查看>>
Bzoj2882 工艺 [线性算法]
查看>>
Bzoj2251 [2010Beijing Wc]外星联络
查看>>
python 发送邮件
查看>>
在凡客四个月的工作总结
查看>>
Qt颜色下拉框
查看>>
31、springboot与任务
查看>>
【转】 一个fork的面试题
查看>>
20131108
查看>>
django.http.request中HttpRequest对象的一些属性与方法
查看>>
英文对应解释
查看>>