Quero obter um número de um Textline.
cat log.txt | grep "License term"
01/01/2024:00:30 License term is 123 days.
Eu só quero separar o "número de contagem regressiva" disso. Existe uma maneira de repetir uma palavra antes/depois da palavra-chave correspondente? Como "exibir a string depois de" é "" ou "exibir a string antes de" dias ""?
Provavelmente é o mesmo, mas pode mudar no futuro. (Formato da entrada de registro ou outras palavras serão adicionadas)
O
sed
comando a seguir encontrará qualquer linhalog.txt
que corresponda à expressão regular.*License term is \([0-9]*\) days\.$
, ou seja, qualquer linha que contenha a substringLicense term is
, seguida por um número inteiro positivo opcional, seguido pela substringdays.
no final da linha. Quando tal linha é encontrada, toda a linha é substituída pelo número inteiro e a linha modificada é gerada, extraindo efetivamente o número que você está solicitando.Outra maneira de fazer isso é com
awk
. O seguinte usa uma abordagem um pouco diferente, apenas combinando as linhas que contêm a stringLicense term
e, em seguida, gerando a penúltima palavra delimitada por espaço nessas linhas:Obviamente, você também pode combinar
grep
com, por exemplo,cut
cortar o quinto campo delimitado por espaço das linhas que contêm a stringLicense term
:Estou usando
grep
essa-F
opção aqui para sinalizar que estamos pesquisando com uma string em vez de uma expressão regular.Com GNU
grep
, você pode usar as opções-o
e-P
, que significam "imprimir apenas a parte correspondente da linha" e "usar expressões regulares compatíveis com Perl", respectivamente. Com PCRE, podemos usar\K
o que significa “descartar qualquer coisa que corresponda até este ponto”. Combinar tudo isso nos dá:Se isso funcionará de forma consistente, é claro, depende do que mais você tem
log.txt
, mas funcionará no seu exemplo.Com
pcre2grep
(ou seu antecessorpcregrep
):Faria uma correspondência conservadora dessas linhas, selecionando apenas aquelas que correspondem
x
efetivamente a esse padrão, eo
geraria o número correspondido pelo1
primeiro grupo de captura a partir daí.Ou o mesmo com perl (o
p
inpcre2grep
):Se o formato for sempre o mesmo eu preferiria o awk do que o grep algo como
awk '{ print $5 }'
ou se você quiser também a dataawk '{ print $1" "$5 }'
Usando Raku (anteriormente conhecido como Perl_6)
OU:
OU:
Essas respostas escritas em Raku são semelhantes em muitos aspectos às excelentes
sed
respostasawk
já postadas. Os dois primeiros conjuntos de respostas usam-ne
sinalizadores linewise sem impressão automática. No primeiro conjunto os///
formulário é usado. No segundo conjunto,words
a rotina de Raku é usada para dividir em espaços em branco. No último conjunto de respostas,lines
a rotina de Raku é usada para encontrar/retornar subesmatch
.Entrada de amostra:
Saída de amostra:
"Marcadores de captura", bem como look-ahead/look-behind também estão disponíveis usando o mecanismo Raku regex. Veja o primeiro link abaixo para obter detalhes. Além disso, você tem a opção de capturar
<[0..9]>
dígitos ASCII ou\d
dígitos ASCII mais Unicode.https://docs.raku.org/language/regexes#Regexes
https://raku.org