如何为某些行数运行 awk。?

coo*_*a06 25 linux awk

我想用awk. 是否可以执行以下任务:

ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
Run Code Online (Sandbox Code Playgroud)

如何显示行号 122 到 129 的详细信息?

zra*_*ajm 45

你还没有理解它是如何awk工作的。指定的“程序”始终为输入的每一行(或 awk 用语中的“记录”)执行一次,不需要FOR或任何类似的构造。只需使用:

详细方法

ls -l | awk 'NR>=122 && NR<=129 { print }'
Run Code Online (Sandbox Code Playgroud)

更紧凑的方法

ls -l | awk 'NR==122,NR==129'
Run Code Online (Sandbox Code Playgroud)

这给出了一个范围NR,即“数字记录”,通常这是当前awk正在处理的行。

  • 实际上,此类任务的典型`awk` 代码通常是`ls -l | awk 'NR==122,NR==129'`。 (6认同)

gho*_*oti 11

另一种替代方法是使用sed:

ls -l | sed -ne '122,129p'
Run Code Online (Sandbox Code Playgroud)

但是,如果正如您的问题所暗示的那样,为此使用 awk 很重要,请使用 manatwork 对 Zrajm 答案的评论。正如 awk 的文档所述:

   A  pattern  may  consist  of two patterns separated by a comma; in this
   case, the action is performed for all lines from an occurrence  of  the
   first pattern though an occurrence of the second.
Run Code Online (Sandbox Code Playgroud)

所以如果你愿意,你也可以做出更高级的条件。例如:

ls -l | awk 'NR==122,/foobar/'
Run Code Online (Sandbox Code Playgroud)

这将从第 122 行开始输出,并一直持续到包含单词“foobar”的一行。

如果您告诉我们实际用例,我们或许能够帮助提供更好解决方案的答案。我担心这听起来像是XY 问题。