我有一个看起来像这样的文件:
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
和对应的子串,否则打印RLENGTH
NA
答案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>