脚本存在几个问题。目前的问题是,在第二次调用awk时,你在脚本周围使用单引号,所以$line_start
和$line_end
是由shell扩展的变量,它们作为脚本的一部分直接传递给awk。您可以通过使用双引号来解决此问题。
awk "NR==$line_start, NR==$line_end" file
这仅是因为$line_start
和$line_end
是数字。如果它们是字符串,则不能这样做,因为shell变量的值最终被awk解析为awk代码的一部分,而不是字符串。在一般情况下,通过一个字符串,awk脚本,你可以用这个成语用-v
到具有相同名称的定义AWK的变量,如shell变量(或以不同的名称,如果你喜欢):
awk -v "line_start=$line_start" -v "line_end=$line_end" 'NR==line_start, NR==line_end' file
有更多的问题与您的脚本。
- 您解析文件两次。如果文件很大,这可能会很慢,如果数据来自管道而不是磁盘文件,则不可能。
- 如果
/regex/
有多个匹配项,则$line_start
将包含行号列表。 shell会在let
行上抱怨语法错误。
如果您想在匹配后显示5行,请在awk中进行计数。
awk '
/regex/ { show_lines = 5 }
show_lines { print; --show_lines; }
' file
如果你只想显示第一匹配块,出口一旦show_lines
达到0
show_lines { print; --show_lines; if (!show_lines) exit; }
哇!你们真棒,非常感谢!我没有提供所有这些信息。非常详细的答案谢谢! – user1639103