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种情况是“假”,其他情况都为“真”
- 数字 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))的值为“真”,不会输出第三行....
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本