You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:命令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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 10:32:42