como extrair string por Regex com grep?

como extrair string por Regex com grep?

digamos que tenho um SQL.txt

select * from table1;
select a,b,c from table2 where a=1;

Como posso filtrar o nome da tabela com o comandocat SQL.txt|grep

Minha saída esperada é:

table1
table2

Sou novato no grepcomando, agradeço qualquer ajuda. Obrigado.

Atualizar

O que eu quero é saber como aplicar o regex no grepcomando.

para este caso, posso escrever o regex: from (.*?). O problema é que não sei usar regex com grep

Responder1

Grep simplesmente usa um padrão e um arquivo como argumentos. Conforme explicado em man grep:

GREP(1)                          User Commands                         GREP(1)

NAME
       grep, egrep, fgrep - print lines that match patterns

SYNOPSIS
       grep [OPTION...] PATTERNS [FILE...]
       grep [OPTION...] -e PATTERNS ... [FILE...]
       grep [OPTION...] -f PATTERN_FILE ... [FILE...]

DESCRIPTION
       grep  searches  for  PATTERNS  in  each  FILE.  PATTERNS is one or more
       patterns separated by newline characters, and  grep  prints  each  line
       that  matches a pattern.  Typically PATTERNS should be quoted when grep
       is used in a shell command.

Portanto, o formato geral é grep 'regex' file. Então, para usar seu exemplo de regex, você faria:

grep 'from (.*?)' file 

Isso não funcionará, entretanto, já que grepusaExpressões regulares básicas(BRE) que não tratam parênteses como caracteres especiais 1 e não entendem o *?operador não ganancioso (encontre a correspondência mais curta). O que você realmente quer é:

grep 'from [^[:blank:]]' file 

Isso usa a classe de caracteres BRE [[:blank:]], masnegacom o ^( [^[:blank:]]) para que agora corresponda a qualquer caractere que não seja espaço em branco. No entanto, isso ainda não é o que você precisa, pois grepretornará toda a correspondêncialinhae não apenas a parte da linha que correspondeu.

Se você possui GNU grep(o padrão no Linux), você tem a -oopção que informa greppara retornar apenas a parte correspondente:

$ grep -o 'from [^[:blank:]]*' file 
from table1;
from table2

Claro que ainda não é isso que você precisa, tem um extra from, um espaço e um trailing ;em um deles. Mais uma vez, se você tiver GNU grep, você pode usar PCRE (Expressões regulares compatíveis com Perl) que suportaolhares ao redor:

$ grep -oP '(?<=from )\w+' file 
table1
table2

Aqui, -oinforma greppara retornar apenas a parte correspondente e -Phabilita o suporte PCRE. O (?<=from )é chamado deolhar positivo para tráse significa "corresponder à próxima parte apenas se a parte anterior corresponder from". Finalmente, \wé uma classe PCRE especial que corresponde a "caracteres de palavras": letras, números e _(e um pouco mais, se estiver usando Unicode). Conforme explicado em man perlre:

\w        [3]  Match a "word" character (alphanumeric plus "_", plus
               other connector punctuation chars plus Unicode
               marks)

PCREs também têm um \Krecurso bacana. É como olhar para trás, mas basicamente significa "ignorar qualquer coisa que corresponda até aqui". Usando isso, podemos simplificar o regex acima para:

$ grep -oP 'from \K\w+' file 
table1
table2

Responder2

Tentei com o comando AWK sem tubulação, testei e funcionou bem

 awk '{for(i=1;i<=NF;i++){if($i ~ /^table/){gsub(";","",$i);print $i}}}' file

saída

table1
table2

informação relacionada