awk 在判断条件中的一些应用。
- 在判断条件中,比较字段 awk -F ':' ' $3<$4 ' 文件名
- 在判断条件中,同时有多个字段条件 awk -F ':' ' $3>5 && $4<7 ' 文件名
- 完整的条件判断写法 { if( ) { } }
- NR 当前行行号 NF 当前行的总段数 并可以作为判断条件
- shell中 = 赋值, == 等于,当作为条件时差别很大
- 复杂逻辑判断语句 awk -F ':' ' { ( 条件 ) } ; END { print } ' 文件名
1) 俩个字段内容之间比较
2) && 并且 || 或者 可以用来设置多重判断条件
(这个例子用的 “ ” 把数字字符化了,则不是按照数字大小比较了,而是按照ASC码大小比较)
第三段大于数字1000 或者 第七段字符内容是 /sbin/nologin ( ==表等于,内容需要完全符合而不仅仅是包含)
第三段大于数字1000 或者 第七段字符内容匹配 /bash/ ( ~表匹配,内容包含就是满足条件了)
OFS 指定打印时候所用到的分隔符。
用{ OFS=”#” } 表达新分隔符相当于 awk -F ':' '{ print $1 # $3 # $7 }' 的表达方式
3) 其实之前都是省略的写法,完整的条件判断写法需要加 { if( ) { } }
4) 内置的变量 OFS分隔符 NR 当前行行号 NF 当前行对应的总段数
NR NF 都可以作为判断条件
每行前打印NR行号出来,相当于打印 行号 + : + 行内容
打印每段对应的NF总分隔段数出来
可见这里每一行都是7段
把NR行号作为条件,比如:
打印前10行,即段号<=10
打印前10行并且是匹配 root 和sync 的行
打印每行中分隔段总数是6的,并且是匹配 root 和sync 的行
原文:
用NR和NF作为输出的段号的变量
例子如下:
第一行即是 $1 : $7
第二行即是 $2 : $7
第三行即是 $3 : $7
因为原文中段数最高到7,所以当NR>7的时候, $NR 没有数据了。
而原文中第一行中只有6段,输出$7 时候输出的实际上是$6的内容,猜测只要 >最后一段以后的段号都是和最后一段显示一个内容。
5) = 赋值 == 等于
$1 = ”root” 打印出来后所有行的第一段全被赋值成了 root
$1 == ”root” 仅仅匹配出了第一段中字符串是root的行
唯一问题就是 = 赋值后的打印出来的是空格作为分隔符,想要分隔符变回“:” 定义下OFS就好了。
6) 复杂逻辑判断语句写法:
' { ( 条件 ) } ; END { print } '
例子:所有行的第三段求和
tot没定义过所以起始值是0 ,第1行的第三段加上第2行的第三段再加上第3行第三段....最后输出结果
把打印的数字进行累加和:
awk '{sum+=$1}END{print sum}'