六周第三次课(4月27日)
9.6/9.7awk
-F :指定分割符
# awk -F ':' '{print $1}' test.txt //$1表示第一段,表示所有的段用$0
打印多段
# awk -F ':' '{print $1,$3,$4}' test.txt
不指定-F选项,默认以空格或空白字符为分割符
指定打印段的分割符
# awk -F ':' '{print $1"@"$3"@"$4}' test.txt
打印包含指定字符的段
# awk '/oo/' test.txt
在指定的段匹配指定的字符
# awk -F ':' '$1 ~ /oo/' test.txt //以冒号分割后取第一段,然后取匹配含oo的
#awk -F ':' '$1 ~ /oo+/' test.txt //同样支持之前的+
在同一个表达式中,多个动作
# awk -F ':' '/root/ {print $1,$3} /sshd/ {print $3,$4}' test.txt
# awk -F ':' '/root|sshd/ {print $0}' test.txt //打印含有root或sshd的行
数学运算相关
# awk -F ':' '$3==0 {print $1}' test.txt //匹配第三段等于0的行,然后打印第一段
#awk -F ':' '$3>=1000 {print $0}' test.txt //第三段大于1000的行
注意数字不能加“”,否则以字符来处理了
# awk -F ':' '$3!=1000 {print $3}' test.txt //打印第三段不等于1000的行的第三段
匹配第三段小于第四段的行,并打印第三段和第四段
# awk -F ':' ' $3<$4 {print $3,$4}' passwd
完整的写法为
# awk -F ':' ' {if ($3<$4) {print $3,$4}}' passwd
#awk -F ':' '$3>1 && $3<7 {print $0}' test.txt //第3段大于1小于7的行 //&&=且
#awk -F ':' '$3>1000 || $7 ~ /bash/ ' passwd //第三段大于1000或第七段匹配bash // ||=或
同时指定新的分割符
# awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1,$3,$7}' passwd //OFS作用是打印的时候指定分割符
打印行号:NR
# awk -F ':' '{print NR ":" $0}' test.txt
打印前10行
# awk -F ':' 'NR<=10' test.txt
# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt //前10中,含有root或sync的行
显示段数:NF
# awk -F ':' '{print NF ":" $0}' test.txt // 每行都是7段
# awk -F ':' 'NF==7 && $1 ~ /root|sync/' test.txt //段数为7且含有root或sync的
# awk -F ':' '{print $NR":"$NF}' test.txt //$NR表示第n行第n段,所以7行之后是空的,$NF其实是代表每行最后一段
“==”和“=”
# head -n 3 test.txt |awk -F ':' '$1=="root"' //匹配第一段为root的
# head -n 3 test.txt |awk -F ':' '$1="root"' //把第一段赋值为root
计算每行第三段值的和(也就是第3列)
# awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt