前两天看到一个使用sed命令输出单双行的命令:
输出单数行:
[root@node17 temp]# seq 10 | awk '(i=!i)'
1
3
5
7
9
输出双数行:
[root@node17 temp]# seq 10 | awk '!(i=!i)'
2
4
6
8
10
为了搞明白这两个命令的逻辑,于是在网上查了下资料。
其实上面那条命令也可以写成下面这样:
输出单数行:
[root@node17 temp]# seq 10 | awk '{if(i=!i) print $0}'
1
3
5
7
9
输出双数行:
[root@node17 temp]# seq 10 | awk '{if(!(i=!i)) print $0}'
2
4
6
8
10
在awk编程语言中以下3种情况是“假”,其他情况都为“真”
- 数字 0
- 空字符串
- 未定义的值
[root@node17 temp]# awk 'BEGIN{a=0;if(a) print "true";else print "false"}'
false
[root@node17 temp]# awk 'BEGIN{a="";if(a) print "true";else print "false"}'
false
[root@node17 temp]# awk 'BEGIN{if(a) print "true";else print "false"}'
false
[root@node17 temp]# awk 'BEGIN{a=1;if(a) print "true";else print "false"}'
true
对于命令中未定义的变量,如果要进行字符串操作,会被赋成空字符串 "",如果要进行数学运算,会被赋成数字 0
[root@node17 temp]# awk 'BEGIN{print a "+" 1}'
+1
[root@node17 temp]# awk 'BEGIN{print a + 1}'
1
知道了上面这两个信息,我们再来看看上面那两个命令:
[root@node17 temp]# seq 10 | awk '{if(i=!i) print $0,i}'
1 1
3 1
5 1
7 1
9 1
这条命令中的变量i没有被定义,从上面可以知道未定义的变量值是“假”,但是经过“(i=!i)”这个语句将!i的值给了i,于是i又变成了“真”,所以输出了第一行;接着来到了第二行,这时i的值是“真”,但是经过“(i=!i)”这个语句,i的值又变成了“假”,所以第二行不会输出,再来到第三行,此时i的值是“假”,但是经过“(i=!i)”这个语句将!i的值给了i,于是i又变成了“真”,所以打印了第三行....以此类推,就实现了只输出单数行。
[root@node17 temp]# seq 10 | awk '{if(!(i=!i)) print $0,i}'
2 0
4 0
6 0
8 0
10 0
同样这条命令中的变量i没有被定义,所以一开始i的值为“假”,经过语句(i=!i),i的值又变成了“真”,所以(!(i=!i))的值为“假”,于是不会打印第一行;接着来到第二行,这时i的值为“真”,经过语句(i=!i),i的值又变成了“假”,所以(!(i=!i))的值为“真”,输出了第二行;再来到第三行,此时i的值是“假”,经过语句(i=!i),i的值又变成了“真”,所以(!(i=!i))的值为“真”,不会输出第三行....
标签:输出,temp,node17,10,双行,sed,awk,print,root From: https://www.cnblogs.com/xzy186/p/16814154.html