sed打印奇偶行(i=!i)

前两天看到一个使用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种情况是“假”,其他情况都为“真”

  1. 数字 0
  2. 空字符串
  3. 未定义的值
[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))的值为“真”,不会输出第三行....

posted @ 2022-10-21 17:17  xzy186  阅读(550)  评论(0编辑  收藏  举报