如何对某些行运行awk?


18

我想用提取一些行awk。是否可以执行以下任务:

ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'

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


如果您要循环执行此操作,建议使用该sed方法,因为sed它比的小得多(并且加载速度更快)awk
zrajm 2013年

Answers:


36

您还不了解awk工作原理。指定的“程序” 对于输入的每一行总是执行一次(或用awk的说法是“记录”),因此不需要FOR或没有任何类似的构造。只需使用:

详细方法

ls -l | awk 'NR>=122 && NR<=129 { print }'

更紧凑的方法

ls -l | awk 'NR==122,NR==129'

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


6
实际上,awk执行此任务的典型代码通常是ls -l | awk 'NR==122,NR==129'
manatwork 2013年

使用awk从文件中获取最后100行的命令是什么
Shihabudheen KM

8

另一种替代方法是使用sed

ls -l | sed -ne '122,129p'

但是,如您的问题所建议的那样,如果使用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.

因此,如果您愿意,还可以设置更高级的条件。例如:

ls -l | awk 'NR==122,/foobar/'

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

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


2

awk使用coreutils的另一种方法(尽管我更喜欢该方法):

ls -l | tail -n +122 | head -n 8
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.