dividir cadeia na primeira ocorrência de um delimitador

2

Eu faço um grep em um shell (bash) para procurar alguns ids em muitos arquivos de log:

grep "100200300" my.log*

resultado é algo assim:

my.log:Jan 17 15:04:52 100200300 ok
my.log.1:Jan 17 14:35:17 100200300 failed

Agora quero remover o nome do arquivo da saída. Então, como posso dividir este texto na primeira ocorrência do ":" e gerar a segunda parte.

    
por jlai79 17.01.2016 / 15:12

3 respostas

2

Como a steeldriver comentou, a maneira preferida é usar a opção -h ( --no-filename ). Se sua implementação de grep não incluir essa opção, você poderá usar sed ou cut para alterar a saída:

grep [OPTIONS] PATTERN [FILE...] | sed 's/[^:]*://'
grep [OPTIONS] PATTERN [FILE...] | cut -d : -f 2-

Observe, no entanto, que essa solução não é genérica, pois é interrompida por nomes de arquivos que contêm dois pontos ( : ).

    
por 17.01.2016 / 18:02
0

Isso fará o que o título desta pergunta perguntar:     "string dividida na primeira ocorrência de um delimitador"

#!/bin/bash
while read -r line; do
    [[ $line =~ :(.*) ]] && echo "${BASH_REMATCH[1]}"
done <<<"$(grep "100200300" my.log*)"

No entanto, acredito que o que você precisa é:

grep -h "100200300" my.log*

A opção -h resultará no conteúdo do arquivo sem nomes de arquivos:

Jan 17 15:04:52 100200300 ok
Jan 17 14:35:17 100200300 failed
    
por 17.01.2016 / 20:42
0

Você também pode fazer isso para se livrar de nomes de arquivos:

cat my.log* | grep "100200300"
    
por 01.09.2016 / 20:58

Tags