
Eu tenho um arquivo parecido com este:
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
O que eu gostaria de fazer é usar o grep no "modo de bloqueio" e, se houver, imprimir a linha inteira, caso contrário, gostaria de imprimir "NA". Não consigo descobrir como imprimir algo para linhas não correspondentes. Tenho certeza que awk ou sed também poderiam fazer isso.
Tenho tentado um código semelhante a:
grep -A6 Volume | grep "lock mode" <file>
Gostaria que a saída mostrasse o seguinte, para este exemplo:
lock mode=exclusive
NA
lock mode=shared
Responder1
É fácil com perl
:
perl -l -00 -ne 'print /lock mode.*/ ? $& : "NA"'
-l
define o delimitador do campo de saída para nova linha-00
: modo parágrafo (os registros são parágrafos)-ne code
: executa o código para cada registro de entrada- se o registro contiver
lock mode
seguido por qualquer número de caracteres que não sejam de nova linha, imprima o que corresponde ($&
) ouNA
não.
Basicamente o mesmo queSolução estranha de @iruvar, mas em perl
.
Responder2
Com awk
no modo parágrafo
awk -v RS= '{match($0, /lock mode=[^\n]+/);
print RSTART? substr($0, RSTART, RLENGTH): "NA"}' file
Isso RS=
faz com que cada parágrafo seja tratado como um único registro. A chamada paracorresponderpreenche as coordenadas de lock mode=....
em variáveis predefinidas RSTART
e RLENGTH
. Se RSTART
for diferente de zero, a substring correspondente a RSTART
e RLENGTH
é impressa, caso contrário, NA
é impressa
Responder3
Com GNUsed
sed -n '
/Volume/!d
:a
n
/lock mode/{
p
d
}
/^\s*$/!ba
c\NA
' <file>
Comestranho
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>