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

时间:2011-01-31 07:35:40

标签: shell unix awk ksh

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

1 个答案:

答案 0 :(得分:5)

您将本地程序awk编写为:

awk -F':' '/:server:APBS/ { print x; x=$0; }' iws_config4.dat

awk程序由模式和这些模式匹配时要采取的操作组成。你写的内容无异于滥用awk的内置功能。<​​/ p>

鉴于您只对$0感兴趣,字段分隔符是多余的,因此-F':'参数可能会出现。

您的计划的作用是:

  • 读一行。
  • 如果匹配模式
    • 打印匹配的最后一行
    • 保存当前行

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


鉴于希望模仿“grep -B1 :server:APBS iws_config4.dat”,您可以这样做:

awk '/:server:APBS/ { print old }
     { old = $0 }' iws_config4.dat

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

它们可能都被压扁到一条线上。在无条件保存之前,模式匹配至关重要。


在显示脚本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
$ 

如果空行可能有问题,只能保存非空行:

awk '/:server:APBS/ { print old }
     /[^ ]/         { old = $0  }' iws_config4.dat

第二行现在仅对包含至少一个非空白字符的行有效,因此只保存那些行。