我正在尝试打印具有匹配字符串的行,但也想为其他行打印“NA”

我正在尝试打印具有匹配字符串的行,但也想为其他行打印“NA”

我有一个看起来像这样的文件:

Volume1  
created=Monday  
blah blah  
foo foo  
lock mode=exclusive  
ops  
layer id=1  

Volume2  
created=Tuesday  
jibber jabber  
foo foo  
ops  
layer id=2  

Volume3  
created=Wednesday  
blaaah  
foooo  
lock mode=shared  
ops  
layer id=3

我想做的是 grep “锁定模式”,如果有,则打印整行,否则我想打印“NA”。我似乎不知道如何打印不匹配行的内容。我确信 awk 或 sed 也可以做到这一点。

我一直在尝试类似的代码:

grep -A6 Volume | grep "lock mode" <file>

对于本例,我希望输出显示以下内容:

lock mode=exclusive  
NA  
lock mode=shared

答案1

这很容易perl

perl -l -00 -ne 'print /lock mode.*/ ? $& : "NA"'
  • -l将输出字段分隔符设置为换行符
  • -00:段落模式(记录为段落)
  • -ne code:为每个输入记录运行代码
  • 如果记录lock mode后面包含任意数量的非换行符,则打印匹配的内容 ( $&) 或NA其他。

基本上与@iruvar 的 awk 解决方案, 但在perl

答案2

段落awk模式

awk -v RS= '{match($0, /lock mode=[^\n]+/); 
  print RSTART? substr($0, RSTART, RLENGTH): "NA"}' file

RS=导致每个段落被视为单个记录。致电给匹配将 的坐标填充lock mode=....到预定义变量RSTART和中RLENGTH。如果RSTART非零,则打印RSTART和对应的子串,否则打印RLENGTHNA

答案3

与GNUsed

sed -n '
    /Volume/!d
    :a
    n
    /lock mode/{
        p
        d
        }
    /^\s*$/!ba
    c\NA
    ' <file>

awk

awk '
    BEGIN{
        FS="\n"
        RS="\n\n"
    }
    /lock mode/{
        for(i=1;i<=NF;i++)
            if($i ~ /lock mode/)
                print $i
        next
    }
    {
        print "NA"
    }
    ' <file>

相关内容