#! /bin/ksh
awk -F':' '{
if( match($0,":server:APBS") )
{
print x;
x=$0;
}
}' iws_config4.dat
答案 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
第二行现在仅对包含至少一个非空白字符的行有效,因此只保存那些行。