Ocultar parte da correspondência da saída do grep

2

Eu tenho um regex para extração de ID de sessão:

[root@docker tmp]# grep -oE "\[[0-9].+\]" logfile
[113a6d9e-7b06-42c6-a52b-7a4e4d2e216c]
[113a6d9e-7b06-42c6-a52b-7a4e4d2e216c]
[root@docker tmp]#

Como posso ocultar os colchetes da saída?

    
por rɑːdʒɑ 28.02.2017 / 10:27

5 respostas

3

Em vez de usar o grep regex estendido ( -E ), use perl-regex grep ( -P ), com um lookbehind e lookahead.

$ grep -oP "(?<=\[)[0-9].+(?=\])" logfile
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c

Aqui, (?<=\[) indica que deve haver um \[ precedente e (?=\]) indica que deve haver um \] a seguir, mas não para incluí-los na saída de correspondência.

    
por 28.02.2017 / 10:37
1
$ cat a.txt
test hello..[113a6d9e-7b06-42c6-a52b-7a4e4d2e216c]... this is
te [113a6d9e-7b06-42c6-a52b-7a4e4d2e216c].  this  is hello

$ grep -oP '(?<=\[)[^\]]*' a.txt
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c

link

    
por 28.02.2017 / 10:40
1

Uma maneira é canalizar para cut :

grep -oE "\[[0-9].+\]" logfile | cut -d'[' -f2 | cut -d']' -f1
    
por 28.02.2017 / 10:40
1

A maneira mais simples seria deixar tr excluí-los:

$ grep -oE "\[[0-9].+\]" logfile | tr -d '[]'
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c

Observe que o utilitário tr não sabe sobre expressões regulares ou padrões da mesma maneira que o shell. Nesse caso, o operando [] é apenas os dois caracteres [ e ] .

    
por 28.02.2017 / 10:45
1

sed é mais aplicável para o caso do que o grep

sed '/\n/{P;D;};s/\[/\n/;s/\]/\n/;D' log
    
por 28.02.2017 / 11:02