我想用提取一些行awk
。是否可以执行以下任务:
ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
如何显示行号122到129的详细信息?
我想用提取一些行awk
。是否可以执行以下任务:
ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
如何显示行号122到129的详细信息?
Answers:
您还不了解awk
工作原理。指定的“程序” 对于输入的每一行总是执行一次(或用awk的说法是“记录”),因此不需要FOR
或没有任何类似的构造。只需使用:
详细方法
ls -l | awk 'NR>=122 && NR<=129 { print }'
更紧凑的方法
ls -l | awk 'NR==122,NR==129'
这给出了一个范围NR
,即“数字记录”,通常这是当前行awk
正在处理的范围。
awk
执行此任务的典型代码通常是ls -l | awk 'NR==122,NR==129'
。
另一种替代方法是使用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问题。
sed
方法,因为sed
它比的小得多(并且加载速度更快)awk
。