awk(上)
awk兼具sed的所有功能,而且还支持分段
截取文档中某个段
打印文档中的某段,-F作用是指定分隔符
打印所有的段awk -F ':' '{print $0}' test.txt
打印文件的全部内容awk '{print $0}' test.txt,不需要加F,类似于cat查看文件
awk如果不指定分隔符,则默认空格或空白为分隔符
打印多段内容awk -F ':' '{print $1,$2,$4}' test.txt
打印内容可以指定#来分割,需要用到双引号
awk匹配功能
awk '/oo/' test.txt ,匹配包含oo的行
awk -F ':' '$1 ~ /oo/' test.txt ,打印第一段中包含oo的行,~表示匹配
awk -F ':' '$1 ~ /o+/' test.txt ,匹配第一段中包含o的行,支持正则表达式;这里需要知道,出现特殊符号时,awk不用加脱义字符,grep和sed则必须要加脱义字符
awk支持多个表达式一起写
针对数学表达式的用法
awk -F ':' '$3==0' test.txt ,匹配第3段等于0的;awk -F ':' '$3==0 {print $1}' test.txt //匹配第3段等于0的,并打印第1段;awk -F ':' '$3>=1000' test.txt //匹配第3段大于等于1000的,并打印所有段
awk -F ':' '$3>="1000"' test.txt,“1000”是以ASC码值进行排序的,被认为是字符串
awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt ,匹配出第7段不是/sbin/nologin的所有段,!=表示不匹配
awk(下)
条件操作符
awk -F ':' '$3<$4' test.txt ,匹配比较第3段小于第4段的行;awk -F ':' '$3==$4' test.txt,匹配出第3段和第4段相等的行,==就是等于,精确匹配
awk -F ':' '$3>"5" && $3<"7"' test.txt ,匹配第3段大于5的,和小于7的行,&&表示并且的意思
awk -F ':' '$3>1000 || $7=="/sbin/nologin"' test.txt ,匹配第3段大于1000的,或者第7段等于/sbin/nologin的所在的行,|| 表示 或者 的意思
awk -F ':' '$3>1000 || $7 ~ /bash/' test.txt,匹配第3段大于1000的,或者第7段包含/bash/的
awk的内置变量
常用的变量有OFS、NF和NR,OFS与-F选项有类似的功能,用来定义分隔符,但是在输出时定义
awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$3,$7}}' test.txt //匹配第3段大于1000,第7段匹配/bash/的,然后打印第1,第3,第7段内容, 并用#分割
NF表示用分隔符分割后一共有多少行;NR表示行号
awk -F ':' 'NR<=10' test.txt ,打印前10行;awk -F ':' 'NR<=10 && $1 ~ /root|sync' test.txt,匹配前10行中,第1段包含root或者sync的
awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt,匹配文件中是6段的,并在第1段包含root或者sync的
awk -F ':' '{print $NR":"$NF}' test.txt
head -n3 test.txt |awk -F ':' '$1="root"' ,在前3行中,给第1段赋值为root
awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt,tot值求和,tot默认0开始,每次和新的第三段值相加,最终第三段值加完,输出tot值