Grep para cadenas literales

101

Busco una herramienta de tipo grep para buscar cadenas puramente literales. Estoy buscando la aparición de una línea de un archivo de registro, como parte de una línea en un archivo de registro separado. El texto de búsqueda puede contener todo tipo de caracteres especiales de expresiones regulares, por ejemplo, []().*^$-\.

¿Existe una utilidad de búsqueda de Unix que no use expresiones regulares, sino que solo busque apariciones literales de una cadena?

Ben
fuente
Megrep pregunto por qué la pregunta no era "¿Puedo buscar cadenas literales?" en lugar de "¿Hay algo así grepque pueda buscar cadenas literales?" Los destornilladores de cabeza plana se ajustan a las cabezas de los tornillos Philips, ya sabe;)
ADTC

Respuestas:

136

Puede usar grep para eso, con la opción -F.

-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings
Scott Stafford
fuente
"cadenas fijas separadas por saltos de línea" ¿Cómo puedo hacer esto en el indicador del terminal? Sé que puedo crear un archivo de patrón, pero sin un archivo, ¿es posible hacerlo en el indicador? Presionar Enter obviamente ejecuta el comando.
ADTC
13
Responderé a mi propia pregunta. :) Solo necesita proporcionar las múltiples cadenas fijas usando repeticiones de la -eopción. De esta manera: grep -F -e "fixed1" -e "fixed2" -e "fixed3" -e "fixed4". No se requieren nuevas líneas;)
ADTC
2
No disponible en Solaris. En fgrepsu lugar se utiliza.
Majkinetor
2
@ADTC Descubrí que tenía que usar comillas simples para la cadena buscada que contiene solo caracteres especiales, de lo contrario no se encontrará nada. Entonces esto no grep --include=\*.php -FRn -e "$$"arrojó ningún resultado: el uso de citas simples me dio el resultado deseado:grep --include=\*.php -FRn -e '$$'
Piemol
2
Estás en lo correcto @ADTC. $y algunos otros caracteres son especiales y serán reemplazados por bash después de presionar enter y antes grep(o cualquier comando) se ejecute. Puede decirle a bash que deje todos los caracteres (excepto las comillas simples) sin tocar encerrándolos entre comillas simples. Si necesita escribir una cita simple, hágalo así'I'\''m special'
ndemou
14

Eso es fgrepo grep -Fque no hará expresiones regulares. fgrepes idéntico a, grep -Fpero prefiero no tener que preocuparme por los argumentos, siendo intrínsecamente vago :-)

grep   ->  grep
fgrep  ->  grep -F  (fixed)
egrep  ->  grep -E  (extended)
rgrep  ->  grep -r  (recursive, on platforms that support it).
paxdiablo
fuente
Para GNU grep, fgrep solo se proporciona como un enlace simbólico a grep lo que hace que tome -F
Daenyth
3
egrepy fgrepno están especificados por el estándar POSIX; grep -Fy grep -E son
Richard Hansen
4

Pasar -Fa grep.

Ignacio Vázquez-Abrams
fuente
3

también puede usar awk, ya que tiene la capacidad de encontrar cadenas fijas, así como capacidades de programación, por ejemplo, solo

awk '{for(i=1;i<=NF;i++) if($i == "mystring") {print "do data manipulation here"} }' file
ghostdog74
fuente
2
cat list.txt
one:hello:world
two:2:nothello

three:3:kudos

grep --color=always -F"hello

three" list.txt

salida

one:hello:world
three:3:kudos
parandhaman
fuente
2
No estoy de acuerdo Es una ilustración útil de cómo funciona esto.
timwaagh