我想用 提取一些行awk
。是否可以执行以下任务:
ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
如何显示第 122 至 129 行的详细信息?
答案1
你还没有理解它是如何awk
工作的。指定的“程序”是总是对输入的每一行(或 awk 术语中的“记录”)执行一次,不需要FOR
或任何类似的构造。只需使用:
详细方法
ls -l | awk 'NR>=122 && NR<=129 { print }'
更紧凑的方法
ls -l | awk 'NR==122,NR==129'
这给出了 的范围NR
,即“编号记录”,通常这是awk
正在处理的当前行。
答案2
另一种替代方法是使用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问题。
答案3
awk
使用 coreutils执行此操作的另一种方法(尽管我更喜欢该方法):
ls -l | tail -n +122 | head -n 8