glcui 发表于 2019-2-18 08:27:23

Linux20180427

  9.6/9.7 awk
  

awk awk相对于sed 更方便的功能是支持了分段。
http://s1.运维网.com/images/20180427/1524811076716138.png
awk不会更改文件的内容


最简单的一种用法,以某种分隔符来分割后,取第几部分打印出来。
awk -F ':' '{print $1}' passwd
-F 分隔符{$1 第一部分}
{$1,$2,$3} 第一二三部分
{$0表示所有段} awk '{print $0}' passwd
http://s1.运维网.com/images/20180427/1524813535882593.png


如果希望分段出来的结果之间有一个分隔显示,可以这样
awk -F ":" '{print $1" "$2" "$3}' passwd 这个就是以:为分隔符,找出第一二三位,中间用空格隔开,当然空格也可以为其他符号
http://s1.运维网.com/images/20180427/1524839752684214.png
http://s1.运维网.com/images/20180427/1524839358879178.png


awk的匹配功能,类似sed的功能
匹配出有oo的段
awk '/oo/' passwd
http://s1.运维网.com/images/20180427/1524839823911967.png
在这个基础上,如果想查看第几个段的,可以加上$位置~ 来匹配。比如像查看第一个段落中是否有oo的
awk -F ':' '$1~ /oo/' passwd 这个场景使用在比如想在passwd查找某一个用户是否存在 因为第一个冒号前面是用户名
http://s1.运维网.com/images/20180427/1524840213702628.png


awk可以支持多个表达式一起写,比如我们想查找含有root的第一位和第三位以及第一位可能有lo的所在行。
表达式要写在一对单引号内,print的内容要用{}


使用场景:

awk -F ':' '/root/ {print $1,$3} $1~/lo+/ {print $0}' passwd
http://s1.运维网.com/images/20180427/1524842057964162.png
operator 11 是啥玩意?其实这个就是passwd里的内容
http://s1.运维网.com/images/20180429/1524983521857349.png
使用awk 和grep同时来展示如何选出包含root 和 user的行

http://s1.运维网.com/images/20180429/1524984102142282.png


接下来的用法可以理解为一个简易的数学运算表达
可以理解为这样:以某种分隔符分割开后的每一部分进行比较, == >= !=

eg awk -F ':' '$1== "root"' passwd分割后的第一部分是否为root
http://s1.运维网.com/images/20180429/1524987515647014.png


eg awk -F ':' '$3 >=1000' passwd 打印出第三部分大于等于1000的
http://s1.运维网.com/images/20180429/1524987914114821.png
注意这个被比较的是1000这个数字。如果把1000用双引号引起来的话,就代表是字符串,也就是按照1000的ANSCII码值。默认如果是字符串比较的话,必须使用双引号
如果不写print的范围,默认的是全部 $0
http://s1.运维网.com/images/20180429/1524988446949945.png
http://s1.运维网.com/images/20180429/1524988632371781.png


http://s1.运维网.com/images/20180429/1524989395866521.png
从上面的例子可以看出,其实awk可以理解为简单的小程序,包括了算数运算,逻辑运算的等。,可以随心所欲的加各种判断条件只要是符合awk的格式
awk -F ':' '$3
页: [1]
查看完整版本: Linux20180427