digo que tengo un SQL.txt
select * from table1;
select a,b,c from table2 where a=1;
¿Cómo puedo filtrar el nombre de la tabla con el comando?cat SQL.txt|grep
Mi resultado esperado es:
table1
table2
Soy novato en grep
el mando, agradezco cualquier ayuda. Gracias.
Actualizar
Lo que quiero es saber cómo aplicar la expresión regular al grep
comando.
para este caso, puedo escribir la expresión regular: from (.*?)
. El problema es que no sé cómo usar expresiones regulares con grep.
Respuesta1
Grep simplemente toma un patrón y un archivo como argumentos. Como se explica en 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.
Entonces, el formato general es grep 'regex' file
. Entonces, para usar tu expresión regular de ejemplo, harías:
grep 'from (.*?)' file
Sin embargo, eso no funcionará, ya que grep
los usosExpresiones regulares básicas(BRE) que no tratan los paréntesis como caracteres especiales 1 y no comprenden el *?
operador no codicioso (buscar la coincidencia más corta). Lo que realmente quieres es:
grep 'from [^[:blank:]]' file
Eso usa la clase de caracteres BRE [[:blank:]]
, peroniegacon ^
( [^[:blank:]]
) para que ahora coincida con cualquier carácter que no sea un espacio en blanco. Sin embargo, esto todavía no es lo que necesita, ya que grep
devolverá la coincidencia completa.líneay no sólo la parte de la línea que coincidía.
Si tiene GNU grep
(el valor predeterminado en Linux), tiene la -o
opción que le indica grep
que solo devuelva la parte coincidente:
$ grep -o 'from [^[:blank:]]*' file
from table1;
from table2
Por supuesto, esto todavía no es lo que necesitas, hay un extra from
, un espacio y un final ;
en uno de ellos. Una vez más, si tiene GNU grep
, puede usar PCRE (Perl Compatible Regular Expressions) que admitemiradas alrededor:
$ grep -oP '(?<=from )\w+' file
table1
table2
Aquí, le -o
indica grep
que solo se devuelva la parte coincidente y -P
habilita la compatibilidad con PCRE. El (?<=from )
se llama unmirada hacia atrás positivay significa "solo coincide con la siguiente parte si la parte anterior coincide from
". Finalmente, \w
hay una clase PCRE especial que coincide con "caracteres de palabras": letras, números y _
(y un poco más, si se usa Unicode). Como se explica en man perlre
:
\w [3] Match a "word" character (alphanumeric plus "_", plus
other connector punctuation chars plus Unicode
marks)
Los PCRE también tienen una \K
característica ingeniosa. Esto es como mirar hacia atrás pero básicamente significa "ignorar todo lo que coincida hasta aquí". Usando eso, podemos simplificar la expresión regular anterior para:
$ grep -oP 'from \K\w+' file
table1
table2
Respuesta2
Probado con el comando AWK sin tuberías, probado y funcionó bien
awk '{for(i=1;i<=NF;i++){if($i ~ /^table/){gsub(";","",$i);print $i}}}' file
producción
table1
table2