El contenido del artículo
Búsqueda de archivos por contenido en Linux
A veces, es posible que desee buscar un archivo que contenga una cadena determinada o encontrar una línea en un archivo que contenga la palabra que desea. Es posible que necesite esto para buscar registros, para buscar archivos de configuración si no sabe dónde están o para buscar archivos con código de programa.
Anteriormente, solo se usaba la utilidad grep para este propósito, pero ahora hay una gran cantidad de otros programas que pueden hacerlo más rápido y proporcionar una interfaz más fácil de usar. En este artículo, veremos los más interesantes de ellos y algunos ejemplos de cómo usarlos.
El contenido del artículo
Búsqueda de archivos por contenido en Linux
Todas las utilidades de este artículo solo funcionan en el terminal. Si está interesado en las aplicaciones GUI, consulte Buscar archivos en Linux. La mayoría de los comandos que se describen a continuación tienen aproximadamente la misma sintaxis:
$ opciones de patrón de comando /ruta/a/carpeta
Un patrón de búsqueda puede ser una palabra común, pero la mayoría de los equipos esperan que sea una expresión regular, por lo tanto, si la consulta tiene una especificación. personajes, es posible que no obtenga lo que espera como resultado. Como regla general, no es necesario especificar la ruta de acceso a la carpeta, por lo que los comandos utilizan la carpeta actual para buscar. Ahora, echemos un vistazo más de cerca a cada equipo.
1. Grep
Antes de pasar a las utilidades modernas, echemos un vistazo al comando grep. Es parte del conjunto de programas GNU y se ha utilizado para buscar cadenas en archivos y archivos por su contenido durante mucho tiempo.
De forma predeterminada, grep filtra un solo archivo o una entrada estándar. Para buscar en una carpeta en varios archivos, debe habilitar la búsqueda recursiva mediante el comando -r. Por ejemplo, encuentre todos los archivos en el archivo /etc/que contienen la cadena raíz:
sudo grep -r "root" /etc/
El comando grep no resalta las ocurrencias de caracteres que estaba buscando en color, puede usar el comando –color=siempre. Pero en la mayoría de las distribuciones, esta opción ya está escrita en el alias de este comando, por lo que la salida se verá así:
sudo grep --color=always -r "root" /etc/
El uso de la función -Con o –contexto Puede elegir mostrar no solo la fila actual en la que se encontró la incidencia, sino también varias líneas antes y después. En este parámetro, debe especificar el número de líneas que se mostrarán:
sudo grep -r -С2 "root" /etc/
De forma predeterminada, grep espera que una consulta de búsqueda sea una expresión regular, pero solo se admite la sintaxis básica. Para habilitar la sintaxis extendida, debe usar el método -E. Por ejemplo, para encontrar todos los archivos que contienen variables que comienzan con la letra Un En /etc/ Hacer:
sudo grep -r -E "^A(A-Z_)+\=" /etc/
Y para buscar una cadena fija, y no una expresión regular, use el método -F o equipo fgrep. Por ejemplo, puede encontrar todos los archivos que contienen la sección (Instalar) en la carpeta /Usr/:
sudo grep -r -F "(Install)" /usr/
2. Ripgrep
Es una alternativa popular a grep escrito en Rust. Puede hacer las mismas cosas que grep, pero es más rápido y es mucho más fácil de usar. La búsqueda recursiva está habilitada de forma predeterminada, y el resaltado de ocurrencias y nombres de archivo en diferentes colores también funciona sin opciones adicionales, y también omite archivos ocultos, binarios y archivos enumerados en .gitignore. Para instalar ripgrep en Ubuntu, use el siguiente comando:
sudo apt install ripgrep
Si ejecuta el comando con una ruta a un archivo, encontrará y mostrará todas las apariciones de la palabra de búsqueda en ese archivo. Por ejemplo:
sudo rg root /etc/passwd
Si carga una carpeta, el comando buscará en todos los archivos que se encuentren en esa carpeta. De forma predeterminada, se utiliza la carpeta actual. Por ejemplo, para encontrar todos los archivos que contienen la palabra «raíz» en el archivo /etc/ Utilice el siguiente comando:
sudo rg root /etc/
Al igual que con grep, puede mostrar no solo una cadena con una ocurrencia, sino también varias líneas antes y después. Por ejemplo, dos de cada uno:
sudo rg -C2 root /etc/
Pero la sintaxis completa de expresiones regulares funciona aquí de forma predeterminada. Por ejemplo:
sudo rg "^A(A-Z_)+=" /etc/
Si desea especificar que desea buscar una cadena y no una expresión regular, utilice el comando -F:
sudo rg -F "(Install)" /usr/
3. Ack
Si necesita encontrar un archivo de código fuente conociendo la cadena que contiene, existen utilidades más adecuadas que grep. Por ejemplo, ack. Ha existido durante bastante tiempo y está diseñado específicamente para trabajar con el código fuente. Además de todas las características de grep, le permite omitir archivos de copia de seguridad, internos Archivos de repositorio .Git y .svn, así como volcados de memoria. Además, puede seleccionar los tipos de archivos en los que se buscará e incluso especificar una parte específica del archivo. Para instalar el programa en Ubuntu, use el siguiente comando:
sudo apt install ack
El ejemplo más simple es buscar todos los archivos que contengan la palabra raíz En /etc/:
sudo ack "root" /etc/
O una expresión regular, como en la sección anterior, para buscar archivos con variables que comiencen con la letra A:
sudo ack "^A(A-Z_)+=" /etc/
Para mostrar no solo la línea con la ocurrencia, sino también las líneas antes y después de ella, use la opción -C.
sudo ack -C "root" /etc/
Equipo Ack Le permite especificar el tipo de archivos que desea buscar. Esto es muy conveniente para buscar a través de fuentes. Solo puede seleccionar archivos fuente C, JavaScript o PHP, etc. Todos los tipos de archivos disponibles se pueden ver usando el comando:
ack --help-types
Por ejemplo, para buscar solo archivos XML, utilice el comando –tipo con el significado de XML:
sudo ack --type=xml "root" /etc/
Otra característica interesante de la utilidad Ack – Configure las partes del archivo que se buscarán mediante una expresión regular. Para ello, se diseñan las siguientes opciones –rango-inicio y –fin-de-rango Y esto funcionará tanto dentro de una sola línea como dentro de todo el archivo. Por ejemplo, para buscar archivos XML solo en los comentarios, puede utilizar el siguiente comando:
sudo ack --type=xml --range-start="\<\!\-\-" --range-end="\-\-\>" "root" /etc/
4. Buscador de plata
Por el momento, es uno de los programas más populares para buscar texto por archivos en Linux. Fue diseñado como una alternativa a ack, como una herramienta para encontrar código. Además de las características básicas de ack, es significativamente más rápido y tiene en cuenta la configuración de exclusión de los archivos .gitignore y .hgignore. Para instalar el programa en Ubuntu, use el siguiente comando:
sudo apt install silversearcher-ag
Veamos el mismo ejemplo que en las secciones anteriores. Para encontrar todos los archivos que contienen la palabra raíz En /etc/ Hacer:
sudo ag "root" /etc/
Semejantemente Grep y ripgrep, Ag espera una expresión regular como patrón de búsqueda, por lo que puede usarla sin ninguna opción adicional. Por ejemplo:
sudo ag "^A(A-Z_)+=" /etc/
Pero si desea que una consulta de búsqueda se trate como una cadena, use el método -Q. Por ejemplo, para buscar todos los archivos que contienen una partición de (Instalar) En /Usr/ Hacer:
sudo ag -Q "(Install)" /usr/
Aquí, también, puede imprimir varias líneas antes y después de la línea con la ocurrencia usando el -Con.
Desemejante grep y ripgrepequipo Ag Le permite especificar el tipo de archivos que desea buscar. Puede ver todos los tipos de archivo disponibles mediante el siguiente comando:
ag --list-file-types
Por ejemplo, para buscar solo por archivos ini, utilice el siguiente comando:
sudo ag --ini "root" /etc/
La utilidad también le permite usar una expresión regular para filtrar archivos por nombre antes de buscar en el contenido. Para hacer esto, debe usar el método -G. Por ejemplo, para buscar solo archivos cuyo nombre termine en conf, ejecute:
sudo ag -G .*\.conf$ root /etc/
5. Desnatado
Esta es otra interesante utilidad de búsqueda difusa en tiempo real escrita en Rust. De forma predeterminada, busca archivos por nombre, pero se puede usar junto con una de las utilidades anteriores para buscar archivos por contenido en tiempo real. El paquete con el programa aún no está en los repositorios oficiales, pero puedes instalarlo usando cargo:
cargo install skim
El comando busca solo en la carpeta actual y no puede especificar otra carpeta, por lo que primero debe navegar a la carpeta deseada mediante el comando CD. Por ejemplo:
cd /etc/
A continuación, utilice este comando para combinar sk con Silver Searcher para filtrar archivos por contenido:
sk --ansi -i -c 'ag --color "{}"'
Aquí está la opción –ANSI incluye la visualización de colores, -Yo incluye un modo interactivo, y el -c Especifica el comando que se ejecutará al escribir una consulta, la cadena {} será reemplazado por lo que escriba cuando busque. Simplemente ejecute el comando y comience a escribir la palabra que desea buscar:
A partir de ahí, puede utilizar todas las funciones de filtrado de búsqueda aproximada para procesar los resultados.
Rendimiento de grep, rg, ack y ag
Antes de terminar el artículo, me gustaría darle una pequeña prueba de rendimiento de las utilidades anteriores para buscar texto en archivos en Linux. Descargué y descomprimí el código fuente de la versión 6.2.10 del kernel de Linux, y luego usé cada una de las utilidades para encontrar todos los archivos que contenían la palabra ext4 y btrfs. Entre diferentes utilidades, el sistema se reinició para eliminar el efecto de caché. Estos son los resultados:
Equipo | Tiempo, s | Equipo | Es el momento, con |
grep -r ext4 ./ | 23.167 | grep -r btrfs ./ | 3.860 |
rg ext4 ./ | 27.164 | rg btrfs ./ | 1.387 |
ack ext4 ./ | 36.141 | ack btrfs ./ | 7.206 |
ag ext4 ./ | 24.594 | AG BTRFS ./ | 3.158 |
Como puede ver, inmediatamente después de que se inicia el sistema, todos los comandos funcionan aproximadamente de la misma manera. Sin embargo, después de eso, las utilidades escritas en Rust usan el caché de manera más eficiente, ya que se ejecutan más rápido que sus contrapartes en C cuando se vuelven a ejecutar para el mismo conjunto de archivos.
Resultados
En este artículo, hemos visto las utilidades más utilizadas para buscar archivos por contenido y buscar texto en archivos en Linux. Como puedes ver, hay suficientes herramientas para elegir. Todos los equipos son bastante similares, pero cada uno de ellos tiene sus propias características. ¿Y qué usas? ¡Escribe en los comentarios!