awk工具

来源:互联网 发布:手机发射激光软件 编辑:程序博客网 时间:2024/05/22 02:22

1、截取文档中的某个段
head -n2 passwd|awk -F ‘:’ ‘{print $1}’
这里写图片描述

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

head -n2 passwd|awk -F ‘:’ ‘{print $0}’
这里写图片描述

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

awk -F ‘:’ ‘{print 1"#"2”#”3"#"4}’
这里写图片描述

2、匹配字符串或字符串
awk ‘/oo/’ passwd
这里写图片描述

可以让某个段去匹配,这里的’~’就是匹配的意思:
awk -F ‘:’ ‘$1 ~/oo/’ passwd
这里写图片描述

awk还可以多次匹配:
awk -F ‘:’ ‘/root/ {print 1,3} /test/ {print 1,3}’ passwd
这里写图片描述

3、条件操作符
awk -F ‘:’ ‘$3==”0”’ /etc/passwd
这里写图片描述

awk中是可以用逻辑符号判断的,比如 ‘==’ 就是等于,也可以理解为 ‘精确匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,值得注意的是,在和数字比较时,若把比较的数字用双引号引起来后,那么awk不会认为是数字,而认为是字符,不加双引号则认为是数字。

awk -F ‘:’ ‘$3>=”500”’ /etc/passwd
这里写图片描述

在上面的例子中,本想把uid大于等于500的行打印出,但是结果并不是我们的预期,这是因为awk把所有的数字当作字符来对待了。

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>"5"||7==”/bin/bash”’ /etc/passwd
这里写图片描述

4、awk的内置变量
awk常用的变量有:
NF :用分隔符分隔后一共有多少段
NR :行数

NF 是多少段:
head -n3 /etc/passwd | awk -F ‘:’ ‘{print NF}‘
这里写图片描述

NR是行号:
head -n3 /etc/passwd | awk -F ‘:’ ‘{print NR}‘
这里写图片描述

我们可以使用行号作为判断条件:
awk ‘NR>20’ /etc/passwd
这里写图片描述

也可以配合段匹配一起使用:
awk -F ‘:’ ‘NR<20 && $1 ~ /roo/’ /etc/passwd
这里写图片描述

5、awk中的数学运算

awk可以把段值更改
head -n 3 /etc/passwd |awk -F ‘:’ ‘$1=”root”‘
这里写图片描述

还可以计算某个段的总和
awk -F ‘:’ ‘{(tot=tot+$3)}; END {print tot}’ /etc/passwd
这里写图片描述

这里的END要注意一下,表示所有的行都已经执行,这是awk特有的语法,其实awk连同sed都可以写成一个脚本文件,而且有他们特有的语法,在awk中使用if判断、for循环都是可以的

awk -F ‘:’ ‘{if (1=="root") {print0}}’ /etc/passwd
这里写图片描述

如果想显示分隔符需要借助OFS:
head -5 /etc/passwd |awk -F ‘:’ ‘{OFS=”#”} {print 1,3,$4}‘
这里写图片描述

awk -F ‘:’ ‘{OFS=”#”} {if (3>1000) {print1,2,3,$4}}’ /etc/passwd
这里写图片描述

原创粉丝点击