awk(上)
相比sed,awk功能更丰富,支持分段
创建awk目录
mkdir awk
cd wak
拷贝passwd到wak目录,改名为test.txt
cp /etc/passwd test.txt
过滤第一段,以冒号为分隔符,-F ':‘表示指定以冒号为分隔符,’{print $1}'表示第一段字符
awk -F ‘:’ ‘{print $1}’ test.txt
打印出所有字符,’{print $1}'表示所有段
awk -F ‘:’ ‘{print $0}’ test.txt
打印出所有字符,没有用F指定分隔符,默认以空格或空白字符为分隔符
awk ‘{print $0}’ test.txt
以冒号为分隔符,过滤出1、3、4段,’{print $1,$3,$4}'表示1、3、4段字符
awk -F’:’ ‘{print $1,$3,$4}’ test.txt
以冒号为分隔符,过滤出1、3、4段,并以#号分隔
awk -F’:’ ‘{print $1"#"$3"#"$4}’ test.txt
过滤出带有oo的行
awk ‘/oo/’ test.txt
过滤出第一段带有oo的行,’$1 ~ /oo/'表示第一段且包含oo
awk -F’:’ ‘$1 ~ /oo/’ test.txt
过滤出第一段有o的行,o+表示一个或多个o
awk -F’:’ ‘$1 ~ /o+/’ test.txt
打印出包含root的行的第一、三段,打印出包含user的行的第1、3、4段,’/root/ {print $1,$3} /user/ {print $1,$3,$4}'表示包含root的行的第1、3段或者包含user的行的第1、3、4段
awk -F ‘:’ ‘/root/ {print $1,$3} /user/ {print $1,$3,$4}’ test.txt
过滤出第三段等于0的行,’$3==0’表示第三段等于0
awk -F ‘:’ ‘$3==0’ test.txt
过滤出第三段大于等于1000的行的第一段,’$3>=1000 {print $1}’ 表示第三段大于等于1000的第一段(需要如果是针对数字的话,不能加双引号)
awk -F ‘:’ ‘$3>=0 {print $1}’ test.txt
过滤出第七段不等于/sbin/nologin的行,’$7!="/sbin/nologin" {print $0}'表示第七段不等于/sbin/nologin(字符串要加双引号)
awk -F ‘:’ ‘$7!="/sbin/nologin" {print $0}’ test.txt
二、awk(下)
过滤出第三段小于第四段的行
awk -F ‘:’ ‘$3<$4’ test.txt
过滤出第三段等于第四段的行
awk -F ‘:’ ‘$3==$4’ test.txt
过滤出第三段大于5并且小于7的行,&&表示并且
awk -F ‘:’ ‘$3>“5” && $3<“7”’ test.txt
过滤出第三段大于1000或者第七段等于/sbin/nologin的行,||表示或者
awk -F ‘:’ ‘$3>1000 || $7=="/sbin/nologin"’ test.txt
过滤出第三段大于1000或者第七段带有bash的行,~ /bash/表示匹配bash
awk -F ‘:’ ‘$3>1000 || $7 ~ /bash/’ test.txt
过滤出第三段大于1000或者第七段带有bash的行的第1、3、7段,用#号分隔
awk -F ‘:’ ‘{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1,$3,$7}’ test.txt
过滤出第三段大于1000的行的第1、2、3、4段,并用#号分隔,OFS变量表示print打印的时候的指定分隔符
awk -F ‘:’ ‘{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}’ test.txt
NR变量表示行
NF变量表示段
显示所有行的行号
awk -F ‘:’ ‘{print NR":"$0}’ test.txt
显示所有行分别有多少段
awk -F ‘:’ ‘{print NF":"$0}’ test.txt
-
过滤出小于等于10行并且第一段带有root或者sync的行
awk -F ‘:’ ‘NR<=10 && $1 ~ /root|sync/’ test.txt
N R 表 示 一 共 有 多 少 段 , NR表示一共有多少段, NR表示一共有多少段,NF表示$7
awk -F ‘:’ ‘{print
N
R
"
:
"
NR":"
NR":"NF}’ test.txt
过滤出前三行,并把第一段赋值成root,’$1=“root”‘表示给第一段赋值,’$1==“root”'表示第一段等于root
head -n 3 test.txt |awk -F ‘:’ ‘$1=“root”’
算出第三段所有的和
awk -F ‘:’ ‘{(tot=tot+$3)}; END {print tot}’ test.txt