Respuestas:
Simplemente especifique los anclajes de expresiones regulares.
grep '^ABB\.log$' a.tmp
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
grep -Fx ABB.log a.tmp
Desde la página de manual de grep:
-F, --fixed-strings
Interpreta PATTERN como una (lista de) cadenas fijas
-x, --line-regexp
Seleccione solo aquellas coincidencias que coincidan exactamente con toda la línea.
-F
¿ No ? ¿estás en Solaris? Si el uso de modo/usr/xpg4/bin/grep
grep
dentro de un script bash y esta opción es mejor que usar una expresión regular como se sugiere en la respuesta aceptada. Porque tengo un carácter especial dentro de la variable que estoy buscando (como .
) y no tengo que escapar de ellos cuando uso el comando.
Esto es lo que hago, aunque usar anclas es la mejor manera:
grep -w "ABB.log " a.tmp
ABB.log
, que no es el caso general, es decir, fallará la mayor parte del tiempo.
La mayoría de las sugerencias fallarán si hay un solo espacio inicial o final, lo que importaría si el archivo se está editando a mano. Esto lo haría menos susceptible en ese caso:
grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp
Un simple ciclo while-read en shell haría esto implícitamente:
while read file
do
case $file in
(ABB.log) printf "%s\n" "$file"
esac
done < a.tmp
de manera similar con awk
awk '/^ABB\.log$/' file
Tengo la intención de agregar una explicación adicional sobre los intentos de OP y otras respuestas también.
También puede usar la solución de John Kugelmans como esta:
grep -x "ABB\.log" a.tmp
citar la cadena y escapar del punto ( .
) hace que ya no necesite la -F
bandera.
Debe escapar del .
(punto) (porque coincide con cualquier carácter (no solo .
) si no se escapa) o usar la -F
bandera con grep. -F
flag lo convierte en una cadena fija (no una expresión regular).
Si no cita la cadena, es posible que necesite una barra invertida doble para escapar del punto ( .
):
grep -x ABB\\.log a.tmp
$ echo "ABBElog"|grep -x ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x "ABB\.log"
#returns empty string, no match
-x
fuerzas para coincidir con toda la línea..
sin -F
bandera son incorrectas.-x
cambio envolviendo su cadena de patrón con ^
y $
. En este caso, asegúrese de no usar -F
, en su lugar, escape .
, porque -F
evitará la interpretación de expresiones regulares de ^
y $
.Si desea hacer coincidir una cadena que comience con -
, debe usar --
con grep. Lo que sigue --
se tomará como entrada (no como opción).
Ejemplo:
echo -f |grep -- "-f" # where grep "-f" will show error
echo -f |grep -F -- "-f" # whre grep -F "-f" will show error
grep "pat" -- "-file" # grep "pat" "-file" won't work. -file is the filename
-F
no será necesario si .
se escapa correctamente.
-F
disponible cuando escribiste esto? Si no es así, ¿qué sistema estaba usando? No pude encontrar esa información en su respuesta hasta ahora, que incluso ahora es el caso cuando lo releo nuevamente. Realmente seguro, leí tu respuesta por completo al menos dos veces. ;)
-F
estaba disponible. (Dije: "o usar la -F
bandera con grep
")
-F
es la respuesta, ¿por qué preocuparse por escapar? ¿Cuál es tu opinión sobre eso?
Esto funcionó bien para mí al intentar hacer algo similar:
grep -F ABB.log a.tmp
$ cat venky
ABB.log
ABB.log.122
ABB.log.123
$ cat venky | grep "ABB.log" | grep -v "ABB.log\."
ABB.log
$
$ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\."
ABB.log.122
$
Funciona para mi :
grep "\bsearch_word\b" text_file > output.txt
\b
indica / establece límites.
Parece funcionar bastante rápido
search_word
límites de palabras separados. Por ejemplo, coincidiría con la línea "foo barra de palabras de búsqueda".
Esto es con HPUX, si el contenido de los archivos tiene espacio entre palabras, use esto:
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
Necesitaba esta función, pero también quería asegurarme de no devolver líneas con un prefijo antes de ABB.log:
grep "\WABB.log$" -w a.tmp
\W
se satisface el liderazgo , que es cualquier carácter que no sea un espacio en blanco, entonces xABBxlog
.