Lectura de patrones grep de un archivo

49

Tengo un par de archivos de texto grandes y en el archivo UNIQS.txttengo una lista de cadenas grepde otro archivo. El código que uso es

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

que no hace nada: el archivo generado está vacío. Pero cuando lo hago

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

Funciona correctamente. Esto me confunde porque no pensé grepque interpretaría las entradas UNIQS.txtcomo patrones regexp sin comillas y barras y así sucesivamente en el archivo (que no hay). ¿Es el caso en general que si obtiene los patrones de un archivo, automáticamente pensará que son patrones regexp?

Editar: en el UNIQS.txtarchivo, hay cadenas separadas por nueva línea del formulario

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(llamados nombres de plantilla) y las EEP_VSL...columnas separadas por la pestaña del archivo , con aproximadamente 14 columnas y la primera columna es el nombre de la plantilla, así que básicamente quiero extraer la línea correspondiente a cada plantilla en el archivo.

sdf
fuente

Respuestas:

60

La -fopción especifica un archivo donde grep lee patrones. Eso es como pasar patrones en la línea de comando (con la -eopción si hay más de uno), excepto que cuando está llamando desde un shell, puede que necesite citar el patrón para evitar que el shell expanda caracteres especiales en él.

El argumento -Eor -Fo -P, si lo hay, le dice a grep en qué sintaxis están escritos los patrones. Sin argumento, grep espera expresiones regulares básicas ; con -E, grep espera expresiones regulares extendidas ; con -P(si es compatible), grep espera expresiones regulares de Perl ; y con -Fgrep espera cadenas literales. No importa si los patrones provienen de la línea de comando o de un archivo.

Tenga en cuenta que las cadenas son subcadenas: si pasa a+bcomo un patrón, entonces una línea que contiene a+b+ccoincide. Si desea buscar líneas que contengan exactamente una de las cadenas suministradas y no más, pase la -xopción.

Gilles 'SO- deja de ser malvado'
fuente
1
Vale, eso es útil, gracias. ¿Puedo preguntar, supongamos que quisiera hacer coincidir exactamente la cadena, es decir, si la cadena es 12345, entonces quiero que coincida solo en 12345, no en 123456 o 123455, etc., cómo haría para hacer esto?
sdf
2
@sdf Lea mi último párrafo:-x
Gilles 'SO- deja de ser malvado'
Esto es muy viejo, perdón por desenterrarlo. Si bien la explicación anterior es impresionante, es un poco vago saber por qué los patrones (cadenas) del archivo no coinciden sin la -Fbandera. Mi conjetura es que -en la línea de muestra anterior hace que esto se lea como una secuencia de caracteres. ¿No requeriría eso también corchetes? He probado con algunos archivos de muestra pero no he llegado a una conclusión.
trs
@trs La línea que se muestra en la pregunta (que se agregó después de publicar mi respuesta) no contiene ningún carácter que tenga un significado especial en expresiones regulares, por lo que se comporta igual con y sin -F. Haría la diferencia con personajes como \[*^$.
Gilles 'SO- deja de ser malvado'
@Gilles gracias, esa fue mi impresión también, pero el @sdf afirma que "el archivo generado está vacío" (léase: sin coincidencias) sin la -Fbandera.
trs
0

Tuve el mismo error, no resuelto con la buena respuesta de @gilles. Mirando más de cerca en el archivo de entrada, encontré 2 líneas nuevas al final. Sin estos, el éxito solo era necesario: grep -i file_pattern_input file

(GNU grep 3.1, archivo de entrada de más de 5000 registros, archivo de coincidencia / patrón 2536, sabía que todo el 2536 tenía que estar en el archivo. Con las nuevas líneas obtuve todas las líneas del archivo y sin solo las 2536 líneas coincidentes)

gracias
fuente
1
Eso no está relacionado con el problema de OP. Grep lee una línea vacía como un patrón vacío, y un patrón vacío coincide en todas partes.
Muru