Isso corresponderá à "tabela_" seguida por 0 ou mais dígitos ASCII:
grep -o 'table_[0-9]*' this.log
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?
Isso corresponderá à "tabela_" seguida por 0 ou mais dígitos ASCII:
grep -o 'table_[0-9]*' this.log
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
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.
Apenas outra abordagem, usando lookbehind:
$ grep -P -o -e '(?<=^SELECT \* FROM )(.*$)' < 'file'
table_02323
table_231
table_1
Tags grep