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
原文地址:http://blog.51cto.com/13530586/2061420