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 grep
comando, agradeço qualquer ajuda. Obrigado.
Atualizar
O que eu quero é saber como aplicar o regex no grep
comando.
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 grep
usaExpressõ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 grep
retornará 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 -o
opção que informa grep
para 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, -o
informa grep
para retornar apenas a parte correspondente e -P
habilita 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 \K
recurso 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