技术问询:命令ls -l | awk '!(NR%2){print}'中!与NR%2的含义解析
详解 awk 表达式
!(NR%2) 的含义 嘿,这个问题问得很到位!我来一步步拆解你提到的!(NR%2),把逻辑讲得明明白白:
1. 先搞懂 NR 是什么
NR 是 awk 的内置变量,全称是 Number of Records,翻译过来就是「当前处理的行号」,它会从1开始逐行递增。比如 awk 处理第一行时,NR=1;处理第二行时,NR=2,以此类推。
2. 再看 NR%2 的作用
% 是取余运算符,NR%2 就是用当前行号除以2,取计算后的余数。举个例子:
- 处理奇数行(第1、3、5行)时:
1%2=1,3%2=1,余数都是1; - 处理偶数行(第2、4、6行)时:
2%2=0,4%2=0,余数都是0。
3. 最后理解 !(NR%2) 的逻辑
! 是逻辑非运算符,用来对后面的结果取反。在 awk 的规则里:
- 非0数值会被认定为「真」,0会被认定为「假」。
把它们结合起来看:
- 当处理偶数行时:
NR%2=0,!0变成「真」,awk 就会执行后面的print命令,打印当前行; - 当处理奇数行时:
NR%2=1,!1变成「假」,awk 会跳过当前行,不执行print。
举个实际例子更直观
假设 ls -l 的输出是这样的:
total 16 -rw-r--r-- 1 alice alice 0 Aug 10 14:30 doc1.md -rw-r--r-- 1 alice alice 0 Aug 10 14:30 doc2.md -rw-r--r-- 1 alice alice 0 Aug 10 14:30 doc3.md -rw-r--r-- 1 alice alice 0 Aug 10 14:30 doc4.md
经过 ls -l | awk '!(NR%2){print}' 处理后,最终输出的是:
-rw-r--r-- 1 alice alice 0 Aug 10 14:30 doc1.md -rw-r--r-- 1 alice alice 0 Aug 10 14:30 doc3.md
也就是跳过了奇数行(第1、3、5行),只打印偶数行,刚好实现了你说的“从第一行开始每隔一行打印”的效果。
内容的提问来源于stack exchange,提问作者newbie00
相关产品推荐
相关产品推荐

