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)
你用原生语写你的程序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)
第二行现在仅在包含至少一个非空白字符的行上处于活动状态,因此仅保存这些行.
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |