Como imprimir apenas os números dos ingressos?

Como imprimir apenas os números dos ingressos?

A seguir está o conteúdo do arquivo e preciso imprimir apenas os números dos tickets que estão entre "[]". Curioso para saber se isso pode ser feito usando os comandos sed e grep.

[request://Problem/26727777] SSO Components (UAT)
[request://Problem/25709048] [SERVER-SETUP] Setup 14xMDN, 10xPRN 
[request://Problem/26716590] Logs not populated properly from all servers
[request://Problem/23995808] Prod: Create requestmary

A saída deve ser:

26727777
25709048
26716590
23995808

Eu tentei sed -e 's/[^0-9]//g' ticket | sed '/^$/d', mas não consigo obter a saída desejada. Também inclui outros valores numéricos na linha, e preciso obter apenas o número do ticket:

226829515211
226855182
2268555334
226819615
226781310
226853999
226828948216

Responder1

Você pode usar GNU grep:

$ grep -oP '/\K\d+(?=])' ticket 
26727777
25709048
26716590
23995808

Ou sed:

sed -E 's#.*/([0-9]*).*#\1#g' ticket
26727777
25709048
26716590
23995808

Ambos os itens acima funcionarão no exemplo que você deu, mas se funcionarão no seu arquivo real dependerá das outras linhas do seu arquivo. Eles imprimem todos os trechos de números que estão depois de a /e, para grep, que estão antes de a ]. Se você tiver outras linhas que correspondam a esses critérios, você precisará nos mostrar o arquivo completo.

Responder2

Eu usaria perl, pessoalmente.

perl -lne 'print /(\d+)\]/'

Deve resolver o problema.

-lpara dizer 'classificar os feeds de linha' - ele os retira automaticamente da linha e os insere após cada arquivo print.

-ndiz 'envolva isso em um while (<>) {loop - que itera linha por linha de STDIN (ou o arquivo) como grepfaria.

E -eé "expressão" (ou "executar", eu acho) para executar o comando entre aspas. (Caso contrário, perlleia o programa de STDIN)

Usamos o fato de que a correspondência padrão para uma regex é contra $_(nesse contexto, essa é a linha atual).

Como especificamos um grupo de captura, em vez de retornar "true" ou "false", ele retorna uma lista (de elemento único) de valores capturados:

\d+é um ou mais dígitos. (É uma expressão regex 'avançada', que é aproximadamente semelhante a [0-9]+, embora funcione de maneira um pouco diferente se você estiver usando números não latinos), e precisamos de um ]depois dela.

E porque nósnãouse gno final do regex, ele corresponde apenas uma vez por linha.

Responder3

sed 's/[^0-9]*\([0-9]*\).*/\1/'

Mas se o número do ticket tivesse largura fixa, prefiro usar cut.

Editar: com grep: grep -o '^\[[^0-9]*[0-9]*' | grep -o '[0-9]*'

Responder4

tr "\[\]/" " "| awk '/request/ {  print $3 }'

informação relacionada