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

“不工作”对您的问题没有用处。它有什么作用?你期望它做什么?你会得到什么输出/错误? “iws_config4.dat”中有什么? –

+0

iam没有得到任何输出。我想在greped之前打印行。 – suvitha

+1

你应该编辑你的问题,使其易于理解,而不是添加评论。你已经有足够的时间去了解如何处理问题的一些基本知识。 –

回答

5

您在本地awk编写程序为:

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

awk程序由图案和采取的行动时,这些模式相匹配。你写的无异于滥用awk的内置设施。

鉴于您只对$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 

第二行现在是唯一的活性上含有至少一个非空字符行,所以只有这些行会被保存。

+0

我试过这个脚本,但我没有得到任何输出。 – suvitha

+0

@suvitha:如果你的输入文件在:Server:APBS行之前有空行,按照你在这里的问题(http://stackoverflow.com/q/4829177/78845),那么你会得到空行作为输出。这就是你所说的“没有输出”的意思吗? – Johnsyweb