Comando grep de Linux
Guía completa de comandos de Linux
El comando grep de Linux (global regular expression) se utiliza para buscar cadenas o expresiones regulares que cumplan condiciones en archivos.
La instrucción grep se utiliza para buscar archivos cuyo contenido contenga el patrón especificado. Si descubre que el contenido de un archivo coincide con el patrón especificado, de forma predeterminada la instrucción grep mostrará la línea que contiene el patrón. Si no se especifica ningún nombre de archivo, o si el nombre de archivo proporcionado es-, entonces la instrucción grep leerá los datos del dispositivo de entrada estándar.
Sintaxis
grep [options] pattern [files] o grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
- pattern: indica la cadena o expresión regular que se va a buscar.
- files: indica los nombres de archivo a buscar. Se pueden buscar varios archivos a la vez. Si se omite el parámetro files, por defecto se leen los datos de la entrada estándar.
Opciones comunes::
-i: Ignorar mayúsculas y minúsculas al realizar la coincidencia.-v: Búsqueda inversa, solo imprime las líneas que no coinciden.-n: Muestra el número de línea de las líneas coincidentes.-r: Busca recursivamente archivos en subdirectorios.-l: Solo imprime los nombres de archivo coincidentes.-c: Solo imprime el número de líneas coincidentes.
Más explicación de parámetros:
- -a o --text: No ignorar los datos binarios.
- -A<número de líneas> o --after-context=<número de líneas>: Además de mostrar la línea que coincide con el patrón, también muestra el contenido posterior a esa línea.
- -b o --byte-offset: Antes de mostrar la línea que coincide con el patrón, indica el número del primer carácter de esa línea.
- -B<número de líneas> o --before-context=<número de líneas>: Además de mostrar la línea que coincide con el patrón, también muestra el contenido anterior a esa línea.
- -c o --count: Cuenta el número de líneas que coinciden con el patrón.
- -C<número de líneas> o --context=<número de líneas> o -<número de líneas>: Además de mostrar la línea que coincide con el patrón, también muestra el contenido anterior y posterior a esa línea.
- -d <acción> o --directories=<acción>: Cuando se especifica que se va a buscar un directorio en lugar de un archivo, se debe usar este parámetro; de lo contrario, el comando grep devolverá un mensaje y detendrá la acción.
- -e<patrón> o --regexp=<patrón>: Especifica una cadena como patrón para buscar el contenido del archivo.
- -E o --extended-regexp: Utiliza el patrón como expresión regular extendida.
- -f<archivo de reglas> o --file=<archivo de reglas>: Especifica un archivo de reglas cuyo contenido contiene uno o más patrones de reglas para que grep busque contenido de archivos que cumpla las condiciones de las reglas. El formato es un patrón de regla por línea.
- -F o --fixed-regexp: Trata el patrón como una lista de cadenas fijas.
- -G o --basic-regexp: Utiliza el patrón como una expresión regular básica.
- -h o --no-filename: Antes de mostrar la línea que coincide con el patrón, no indica el nombre del archivo al que pertenece la línea.
- -H o --with-filename: Antes de mostrar la línea que coincide con el patrón, indica el nombre del archivo al que pertenece la línea.
- -i o --ignore-case: Ignora la distinción entre mayúsculas y minúsculas.
- -l o --file-with-matches: Lista los nombres de archivos cuyo contenido coincide con el patrón especificado.
- -L o --files-without-match: Lista los nombres de archivos cuyo contenido no coincide con el patrón especificado.
- -n o --line-number: Antes de mostrar la línea que coincide con el patrón, indica el número de línea de esa línea.
- -o o --only-matching: Solo muestra la parte que coincide con PATTERN.
- -q o --quiet o --silent: No muestra ninguna información.
- -r o --recursive: Este parámetro tiene el mismo efecto que especificar el parámetro "-d recurse".
- -s o --no-messages: No muestra mensajes de error.
- -v o --invert-match: Muestra todas las líneas que no contienen el texto coincidente.
- -V o --version: Muestra la información de versión.
- -w o --word-regexp: Solo muestra las líneas que coinciden con la palabra completa.
- -x --line-regexp: Solo muestra las líneas que coinciden en su totalidad.
- -y : Este parámetro tiene el mismo efecto que especificar el parámetro "-i".
Guía completa de comandos de Linux
Ejemplos
1. Buscar la cadena "hello" en el archivo file.txt e imprimir las líneas coincidentes:
grep hello file.txt
2. Buscar recursivamente en todos los archivos de la carpeta dir las líneas que coinciden con la expresión regular "pattern" e imprimir el nombre del archivo y el número de línea de las líneas coincidentes:
grep -r -n pattern dir/
3. Buscar la cadena "world" en la entrada estándar e imprimir solo el número de líneas coincidentes:
echo "hello world" | grep -c world
4. En el directorio actual, buscar archivos que tengan "file" en el sufijo y que contengan la cadena "test", e imprimir las líneas con esa cadena. En este caso, se puede usar el siguiente comando:
grep test *file
El resultado es el siguiente:
$ grep test test* #查找前缀有“test”的文件包含“test”字符串的文件 testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行 testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行 testfile_2:Linux test #列出testfile_2 文件中包含test字符的行
5. Buscar recursivamente archivos que cumplan las condiciones. Por ejemplo, para buscar archivos que contengan la cadena "update" en todos los archivos del directorio especificado /etc/acpi y sus subdirectorios (si existen), e imprimir el contenido de la línea donde se encuentra la cadena, el comando utilizado es:
grep -r update /etc/acpi
La salida es la siguiente:
$ grep -r update /etc/acpi #以递归的方式查找“etc/acpi” #下包含“update”的文件 /etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.) Rather than /etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.) Rather than /etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update
6. Búsqueda inversa. Los ejemplos anteriores buscan e imprimen las líneas que cumplen la condición. Con el parámetro "-v" se puede imprimir el contenido de las líneas que no cumplen la condición.
Para buscar en archivos cuyo nombre contenga "test" las líneas que no contengan "test", el comando utilizado es:
grep -v test *test*
El resultado es el siguiente:
$ grep-v test* #查找文件名中包含test 的文件中不包含test 的行 testfile1:helLinux! testfile1:Linis a free Unix-type operating system. testfile1:Lin testfile_1:HELLO LINUX! testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM. testfile_1:THIS IS A LINUX TESTFILE! testfile_2:HELLO LINUX! testfile_2:Linux is a free unix-type opterating system.Otras extensiones