grep e saída palavra inteira

0

Eu tenho um longo e longo arquivo de log de comandos SQL, e eu sou interessante em mostrar apenas o nome das tabelas. Por exemplo:

SELECT * FROM table_02323
SELECT * FROM table_231
SELECT * FROM table_1

Eu quero o grep para que o resultado retorne

table_02323
table_231
table_1

A coisa mais próxima que eu obtive é grep -o 'table.....' this.log , mas obviamente o sufixo terá comprimentos diferentes. Existe uma expressão regex para a saída sem ser restringida por um comprimento de correção, como é o caso com os períodos de uso?

    
por David G 01.09.2017 / 20:55

4 respostas

4

Isso corresponderá à "tabela_" seguida por 0 ou mais dígitos ASCII:

grep -o 'table_[0-9]*' this.log
    
por 01.09.2017 / 21:00
0

Use o GNU grep , como abaixo:

grep -oiP 'FROM\s*\K\w+' infile

Não-GNU:

grep -ioP 'FROM[ ]*\K[A-Z_0-9]+' infile

Isso garantirá que você esteja apenas recebendo o nome da tabela.

Teste:

grep -ioP 'FROM\s*\K\w+' <<<"SELECT * FROM table_02323 where 1=1"
table_02323
    
por 01.09.2017 / 21:02
0

De man grep :

Repetition
       A regular expression may be followed by one of several repetition operators:
       ...
       *      The preceding item will be matched zero or more times.

Então você quer usar algo como

$ grep -o 'table\w*'

onde \w é qualquer caractere que não seja espaço em branco, repetido zero ou mais vezes.

    
por 01.09.2017 / 21:06
0

Apenas outra abordagem, usando lookbehind:

$ grep -P -o -e '(?<=^SELECT \* FROM )(.*$)' < 'file'
table_02323
table_231
table_1
    
por 01.09.2017 / 21:14

Tags