Você parece pensar que awk
trata sua entrada como uma cadeia de múltiplas linhas. Não faz. Quando você executa um script awk em um arquivo, o script é aplicado para cada linha do arquivo separadamente. Então, seu gensub
foi executado uma vez por linha. Você pode realmente fazer o que quiser com awk
, mas realmente não é a melhor ferramenta para o trabalho.
Tanto quanto eu posso dizer, você tem um arquivo grande e só quer imprimir um número que vem depois de mark:
e espaço em branco. Se sim, todas essas abordagens são mais simples do que brincar com gensub
:
-
Use
grep
com expressões regulares compatíveis com Perl (-P
)$ grep -oP 'mark:\s*\K\d+' file 98
O
-o
faz com quegrep
imprima apenas a parte correspondente da linha. O\K
é uma construção PCRE que significa "ignorar qualquer coisa correspondida antes desse ponto". -
sed
$ sed -n 's/.*mark:\s*\([0-9]\+\).*//p' file 98
O
-n
suprime a saída normal. Op
no final tornased
print somente se a substituição foi bem-sucedida. O próprio regex captura uma sequência de números seguindomark:
e 0 ou mais caracteres de espaço em branco e substitui toda a linha pelo que foi capturado. -
Perl
$ perl -ne 'print if s/.*mark:\s*(\d+).*/$1/' file 98
O
-n
diz ao perl para ler um arquivo de entrada linha por linha e aplicar o script fornecido por-e
. O script imprimirá todas as linhas em que a substituição foi bem-sucedida.
Se você realmente quiser usar gensub
, poderá fazer algo como:
$ awk '/mark:/{print gensub(/.*mark:\s*([0-9]+).*/,"\1","g")}' file
98
Pessoalmente, eu faria assim no awk:
$ awk '/mark:/{gsub(/[^0-9]/,"");print}' file
98
Desde que você parecia estar tentando obter o awk para receber entrada de múltiplas linhas, é assim que você pode fazer isso (assumindo que não haja caracteres NULL em seu arquivo):
$ awk '{print(gensub(/^.*mark: ([0-9]+).*$/,"\1","g"))}' RS='$ grep -oP 'mark:\s*\K\d+' file
98
' file
98
O RS='
define o separador de registro de entrada (que é o que define uma "linha" para awk
'
) para %code% . Como não há tais caracteres em seu arquivo, isso resulta em %code% lendo tudo de uma vez. awk