为什么这段代码不起作用?

suv*_*tha 0 unix shell awk ksh

#! /bin/ksh
awk -F':' '{
if( match($0,":server:APBS") )
{
 print x;
 x=$0;
}
}' iws_config4.dat
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 5

你用原生语写你的程序awk:

awk -F':' '/:server:APBS/ { print x; x=$0; }' iws_config4.dat
Run Code Online (Sandbox Code Playgroud)

一个awk程序由图案和当这些模式匹配采取行动.你写的东西等于滥用内置的设施awk.

鉴于你只对它感兴趣$0,字段分隔符是多余的,所以-F':'参数可以去.

你的程序做的是:

  • 读一条线.
  • 如果它匹配模式
    • 打印匹配的最后一行
    • 保存当前行

因此,如果您的输入包含一个匹配项,则您看不到任何输出(或者更准确地说,是空白行).如果您的输入包含两个匹配项,则会看到第一个匹配项 如果三,前两个; 等等.


鉴于希望效仿' grep -B1 :server:APBS iws_config4.dat',你可以这样做:

awk '/:server:APBS/ { print old }
     { old = $0 }' iws_config4.dat
Run Code Online (Sandbox Code Playgroud)

如果该行匹配,则打印旧保存的行.无论如何,将当前行存储为(新)旧保存行.

它可能都可以扁平化为一条线.在无条件保存之前,模式匹配至关重要.


给定显示的脚本k.awk和数据文件iws_config4.dat,我得到了我期望的输出.你得到了什么?你能指望什么?

$ cat iws_config4.dat
One line of text followed by the marker
:server:APBS blah blah bah 1
:server:APBS blah blah bah 2
More text
     Blah blah blah
$ cat k.awk
awk '/:server:APBS/ { print old }
     { old = $0 }' iws_config4.dat
$ sh k.awk
One line of text followed by the marker
:server:APBS blah blah bah 1
$ 
Run Code Online (Sandbox Code Playgroud)

如果空行可能是麻烦,只保存非空行:

awk '/:server:APBS/ { print old }
     /[^ ]/         { old = $0  }' iws_config4.dat
Run Code Online (Sandbox Code Playgroud)

第二行现在仅在包含至少一个非空白字符的行上处于活动状态,因此仅保存这些行.