您的位置:首页 > 运维架构 > Linux

Linux26期 7月5日预习笔记

2020-02-05 08:05 190 查看

9.6/9.7 awk
扩展
把这里面的所有练习题做一下
http://www.apelearn.com/study_v2/chapter14.html

awk工具的使用

awk 兼具sed的所有功能,而且更加强大。它也是针对文档的行来操作,一行一行地执行。

  • 截取文档中的某个段

#head -n2 test.txt |awk -F ‘:’ ‘{print $1}’

本例中,-F选项的作用是指分隔符。如果不加-F选项,则以空格或者tab为分隔符。

Print为打印的动作,用来打印某个字段。

$1为第一个字段,$2为第二个字段,以此类推。

但$0比较特殊,它表示整行。

 

#head -n2 test.txt |awk -F’:’ ‘{print $0}’

注意awk的格式,-F后面紧跟单引号,单引号里面为分隔符。

Print的动作要用{ }括起来,否则会报错。Print还可以打印自定义的内容,但是自定义的内容要用双引号括起来,如下:

#head -n2 test.txt |awk -F ‘:’ ‘{print $1”#”$2”#”$3”#”$4}’

 

  • 匹配字符或者字符串

#awk ‘/oo/’ test.txt

跟sed的用法类似,能实现grep的功能,但没有颜色显示,肯定没有grep用起来方便。不过awk还有比sed更强大的匹配。如下:

#awk -F ‘:’ ‘$1 ~/oo/’ test.txt

它可以让某个段去匹配,这里的~就是匹配的意思。Awk还可以多次匹配。如下:

#awk -F ‘:’ ‘/root/ {print $1,$3} /test/{print $1,$3}’ test.txt

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

 

  • 条件操作符

#awk -F ‘:’ ‘$3==”0”’ /etc/passwd

Awk中可以用逻辑符号进行判断,比如==就是等于,也可以理解为精确匹配。

另外还有>,>=,<,<=,!=等。

注意:在和数字比较时,若把比较的数字用双引号引起来,那么awk不会认为是数字,而会认为是字符,不加双引号则会认为是数字。

#awk -F ‘:’ ‘$3>=”500”’ /etc/passwd

本例中,本想把uid大于等于500的行打印出来,但结果并不理想,因为awk把所有的数字当作字符了,就跟上一章提到的sort排序原理一样。但,不加双引号就得到了想要的结果。

 

# awk -F ‘:’ ‘$3>=500’ /etc/passwd

 

#awk -F ‘:’ ‘$7!=“/sbin/nologin”’ /etc/passwd

本例中,!=表示不匹配,它除了针对某一个段的字符进行逻辑比较外,还可以在两个段之间进行逻辑比较。如下:

#awk -F ‘:’ $3<$4’ /etc/passwd

另外还可以使用$$ 和 || ,它们分别表示“并且“和”或者“。

$$的用法如下:

#awk -F ‘:’ ‘$3>”5” $$ $3<”7”’ /etc/passwd

 

||的用法如下:

#awk -F ‘:’ ‘$3>1000 || $7==”/bin/bash”’ /etc/passwd

 

  • awk的内置变量

awk 常用的变量有OFS, NF 和 NR ,OFS 和 -F选项有类似的功能,也是用来定义分隔符的,但是它是在输出的时候定义, NF 表示用分隔符分隔后一共有多少段,NR表示行号。

OFS的用法示例如下:

#head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}'

还有一个更高级的用法:

 

变量NF的具体用法如下:

这里NF是多少段,$NF是最后一段的值。

变量NR的具体用法如下:

我们还可以使用NR作为判断条件,如下

NR也可以配合段匹配一起使用,如下

 

awk中的数学运算

awk也可以对各个段的值进行数学运算,如下:

awk还可以计算某个阶段的总和,示例如下

这里的END 是awk特有的语法,表示所有的行都已经执行。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3851620/blog/1841030

  • 点赞
  • 收藏
  • 分享
  • 文章举报
chougenong2883 发布了0 篇原创文章 · 获赞 0 · 访问量 88 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: