1、截取文档中的某个段
head -n2 passwd|awk -F ‘:’ ‘{print $1}’
-F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符。 Print为打印的动作,用来打印出某个字段。1为第一个字段,2为第二个字段,依次类推,有一个特殊的那就是$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