¿Cómo extraer una cadena mediante Regex con grep?

¿Cómo extraer una cadena mediante Regex con grep?

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 grepel mando, agradezco cualquier ayuda. Gracias.

Actualizar

Lo que quiero es saber cómo aplicar la expresión regular al grepcomando.

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 greplos 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 grepdevolverá 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 -oopción que le indica grepque 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 -oindica grepque solo se devuelva la parte coincidente y -Phabilita 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, \whay 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 \Kcaracterí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

información relacionada