
我有一個看起來像這樣的文件:
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>