awk命令

awk是什么

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。

常用的命令有哪些

$0代表整行,$1代表第一列$2和之后的数字都代表第几列。

截取文档中的的某段

awk -F ':' '{print $1}' 1.txt

说明: -F 指定分隔符号为 :

PS:如果什么选项都不加 默认是以空格为分隔符(如图)

也可以使用自定义字符连接每个段

awk -F ':' '{OFS="#"} {print $3,$4}' 1.txt

说明: OFS="#" #为自定义分隔符,并不等于文档内部的分隔符,只输出在屏幕上而已,这是使用内部变量来指定分隔符

匹配字符或字符串

awk '/oo/' 1.txt

匹配多个字符串(如匹配root和user)

awk '/root|user/' 1.txt

针对某个段匹配

awk -F ':' '$1 ~/oo/' 1.txt

多次匹配

awk -F ':' '/root/ {print $1,$2}; $1 ~/test/; $3 ~/20/' 1.txt

条件操作符 ==,>,<,!=,>=;<=

条件:第三段为0

awk -F ':' '$3==0 {print $3}' 1.txt;

条件:第三段大于等于500

awk -F':' '$3>=500 {print $3}' 1.txt;

说明:当比较数字时,不能加双引号,如果写成$3>="500"就不符合我们的要求了。

条件:第七段不是'/sbin/nologin/'

awk -F ':' '$7!="/sbin/nogin"' 1.txt

条件:第三段小于第四段

awk -F ':' '$3<$4' 1.txt

条件:第三段大于5,并且第三段小于7

awk -F ':' '$3>5 && $3<7' 1.txt

第三段大于5或者第七段为‘bin/bash’

awk -F ':' '$3>"5" || $7=="bin/bash"' 1.txt

PS:要在条件后面加上打印print,要不然会输出整行,如下

awk -F ':' '$3=="0" {print $3}' 1.txt;

awk内置变量 NF(段数) NR(行数)

head -n3 1.txt | awk -F ':' '{print NF}'

head -n3 1.txt | awk -F ':' '{print $NF}'

head -n3 1.txt | awk -F ':' '{print NR}'

打印20行以后的行

awk -F 'NR>20' 1.txt

打印20行以后并且第一段包含'ssh'的行

awk -F ':' 'NR>20 && $1 ~/ssh/' 1.txt

更改某个段的值

awk -F ':' '$1="root"' 1.txt

数学计算,把第三段和第四段值相加,并赋予第七段

awk -F ':' '{$7=$3+$4; print $0}'1.txt

但是这样的话,相当于改变了原来文本的结构,所以print $0的时候就不在有分隔符显示,如果想要显示分隔符就需要借助OFS

awk -F ':' '{OFS=":"} {$7=$3+$4; print $0}' 1.txt

$NF表示最后一列,如图:

有的时候我们懒得去数最后一段,就用变量NF。

拓展:

awk详细资料:http://man.linuxde.net/awk