Este tema es un conocimiento esencial para todos los usuarios de UNIX, Linux, Solaris, OS X y BSD. Adem谩s, la certificaci贸n LPI contiene preguntas complicadas sobre esto.
Si desea buscar archivos con un nombre de archivo determinado mediante la l铆nea de comando, utilice el find
o la locate
comandos. Pero si desea encontrar archivos que contengan un texto determinado, querr谩 usar grep y sus amigos. Aqu铆, el t茅rmino amigos significa un grupo de herramientas similares que se adaptan a un formato de datos espec铆fico o estructura de archivo como texto sin formato, archivos comprimidos y documentos PDF.
Esto es lo que cubriremos en este art铆culo:
- B煤squeda de texto b谩sica
- M谩s opciones de grep
- B煤squeda de archivos comprimidos
- B煤squeda de otros tipos de documentos
- Conclusi贸n
B煤squeda de texto b谩sica
Contenido
El nombre grep
es una combinaci贸n de las letras iniciales de las cuatro palabras “gramolobal / regular mixpresi贸n / pagsrint “. Esto es similar a formular patrones de b煤squeda en el editor de transmisiones sed
. grep
est谩 dise帽ado para encontrar patrones acordes en flujos de datos completos (archivos). Los patrones dados se interpretan como texto o Expresiones regulares (vea a continuaci贸n un ejemplo).
El ejemplo 1 muestra c贸mo descubrir todas las apariciones del nombre de marca “Mikrotik” escrito como “Mikrotik” o “MikroTik”. Usamos grep para buscar en todos los archivos cuyo nombre comienza con “factura-2017”. El resultado es una lista de nombres de archivos con las coincidencias correspondientes, una por l铆nea precedida por el nombre del archivo.
Ejemplo 1: llamar a grep con una expresi贸n regular
$ grep Mikro[tT]ik invoice-2017*
invoice-20170015.text:Mikrotik Routerboard 750GL Gigabit Switch
invoice-20170045.text:MikroTik RouterBoard RB250GS Gigabit Switch
Esta salida es 煤til pero no contiene el n煤mero de l铆nea. Para mostrar el n煤mero de l铆nea con grep, use la opci贸n -n
o --line-number
como la versi贸n larga. Entonces, el resultado es el siguiente:
Ejemplo 2: llamar a grep con una expresi贸n regular y n煤meros de l铆nea
$ grep -n Mikro[tT]ik invoice-2017*
invoice-20170015.text:64:Mikrotik Routerboard 750GL Gigabit Switch
invoice-20170045.text:65:MikroTik RouterBoard RB250GS Gigabit Switch
En cada l铆nea, los campos de salida individuales est谩n separados por dos puntos. El primer campo contiene el nombre del archivo (“factura-20170015.text”), el segundo campo es el n煤mero de l铆nea dentro del archivo coincidente (“64”) y el tercer campo es la l铆nea completa con el texto coincidente (“Mikrotik Routerboard 750GL Conmutador Gigabit “).
M谩s opciones de grep
grep
tiene una larga lista de opciones 煤tiles. Consulte la p谩gina del manual para obtener una descripci贸n detallada. Los m谩s relevantes para este art铆culo son:
Opci贸n corta Opci贸n larga Descripci贸n
-yo | –ignorar caso | escritura en min煤sculas y may煤sculas |
-l | –archivos-con-coincidencias | detenerse despu茅s de la primera coincidencia y generar el nombre del archivo |
-norte | –n煤mero de l铆nea | muestra el n煤mero de l铆nea del partido |
-r | –recursivo | buscar recursivamente |
–color o –color | resaltar la coincidencia real |
Con la excepci贸n de resaltar la coincidencia real, el Ejemplo 3 combina las opciones -i
, -r
y -l
como se describi贸 anteriormente. Esto simplifica la llamada y devuelve una lista de archivos con coincidencias, sin importar cu谩ntas coincidencias existan para cada archivo. Con la ayuda de esto, puede ver si hay coincidencias y, de ser as铆, en qu茅 archivos.
Ejemplo 3: c贸mo buscar todos los archivos que contienen el t茅rmino “mikrotik” en cualquier tipo de ortograf铆a de forma recursiva
$ grep -irl mikrotik invoice-2017*
invoice-20170015.text
invoice-20170045.text
El comando grep
viene con dos variantes especiales – fgrep
y egrep
. fgrep
interpreta el patr贸n de b煤squeda como una cadena de caracteres individuales y es exactamente igual que grep -F
(y grep --fixed-strings
).
A diferencia de, egrep
toma el patr贸n como una expresi贸n regular y es similar a grep -E
(y grep --extended-regexp
). En versiones anteriores de Linux anteriores a Debian 4 Etch, ambos comandos se implementan como scripts de shell que llaman grep
con opciones especiales. Hoy en d铆a, las versiones actuales de Linux mantienen los comandos como archivos binarios. En cualquier caso, la b煤squeda es un poco m谩s r谩pida que usar grep
sin esta opci贸n especial.
B煤squeda de archivos comprimidos
grep
no puede inspeccionar los archivos comprimidos correctamente. Ahora, los especialistas nombrados zgrep
, bzgrep
, xzgrep
y zipgrep
entrar en el escenario. Estas herramientas te ayudan a simplificar comandos como este:
$ zcat archive.gz | fgrep [pattern]
zcat
descomprime el archivo dado y env铆a su contenido a stdout
. Canalizado a fgrep
, el flujo de datos se busca para el dado [pattern]
.
Con la ayuda de los comandos anteriores, no tiene que descomprimir archivos comprimidos con gzip
, bzip2
, xz
y zip
antes de la b煤squeda: este paso ocurre detr谩s de escena. Al igual que con grep
, las variantes especiales zfgrep
y zegrep
para gzip
existir as铆 como bzfgrep
y bzegrep
para bz
y xzfgrep
y xzegrep
para xz
archivo. El ejemplo 4 muestra c贸mo buscar un xz
-archivo comprimido.
Ejemplo 4: b煤squeda de un xz
-archivo comprimido
$ xzfgrep Mikrotik invoice-20130015.text.xz
Mikrotik Routerboard RB450G Level 5 680MHz
La b煤squeda de archivos comprimidos es un poco m谩s compleja y requiere un poco de scripts de shell. El Listado 1 demuestra un script de shell que solo funciona con gzip
-archivos comprimidos. Para simplificar, guardamos el siguiente script con el nombre “search.sh”. El script requiere dos par谩metros: el patr贸n de b煤squeda y el nombre de archivo del archivo comprimido (consulte el Ejemplo 5 a continuaci贸n).
Listado 1: B煤squeda comprimida gzip
archivo
#!/bin/bash
pattern=$1
archive=$2
for filename in $(tar -tzf "$archive");
do
match=$(tar -xOzf "$archive" "$filename" | fgrep "$pattern") && echo "$filename:";
echo "$match" | fgrep --color "$pattern";
echo "";
done
Ejemplo 5: llamar al script
$ ./search.sh Mikro archive.tar.gz
invoice-20110045.text:
Mikrotik
invoice-20110110.text:
MikroTik
Comprender el gui贸n puede requerir un momento. Primero, el script extrae la lista de archivos del archivo y eval煤a cada archivo uno tras otro. El exterior for
loop hace todo el trabajo complejo. En segundo lugar, las coincidencias individuales se guardan en la variable $match
. Por lo tanto, el archivo actual se extrae del archivo comprimido y luego se canaliza a fgrep
. fgrep
busca en el flujo de datos e indica una coincidencia con un valor de retorno positivo. En caso de que lo siguiente echo
se ejecuta el comando y el nombre del archivo se env铆a a stdout
. En tercer lugar, tambi茅n se imprime la coincidencia real, seguida de una l铆nea vac铆a. Esto separa las diferentes coincidencias por archivo.
Una alternativa es la herramienta deepgrep
que forma parte del motor de b煤squeda de escritorio Strigi (Paquete Debian strigi-utils). Busca tar.gz
archivos as铆 como zip
archivos, paquetes Debian e incluso archivos de Microsoft Word. El ejemplo 6 muestra c贸mo funciona. L铆nea por l铆nea ver谩 el nombre del archivo y las coincidencias correspondientes.
Ejemplo 6: b煤squeda de un archivo utilizando deepgrep
$ deepgrep Mikro archive.tar.gz
archive.tar.gz/invoice-20110045.text:Mikrotik
archive.tar.gz/invoice-20110110.text:MikroTik
$
B煤squeda de otros tipos de documentos
deepgrep
cubre muchos formatos de archivo pero tiene bastantes dependencias de paquetes. En su lugar, puede echar un vistazo a pdfgrep
y ssgrep
, en su lugar. pdfgrep
est谩 especializado en documentos PDF y ssgrep
es para hojas de c谩lculo.
Lo que me gusta de pdfgrep
es tanto su simplicidad en el uso como su variedad en t茅rminos de opciones. Las coincidencias se resaltan sin necesidad de especificar m谩s argumentos.
La opci贸n -n
, que se muestra en uso a continuaci贸n, ayuda a identificar la p谩gina en la que se descubri贸 el patr贸n. En el Ejemplo 7, cada l铆nea consta de tres campos de datos separados por una columna: el nombre del archivo, el n煤mero de p谩gina de la coincidencia y el texto extra铆do de la coincidencia. Si el terminal de salida admite colores, los campos de datos y las coincidencias se resaltan de diferentes maneras.
Ejemplo 7: b煤squeda de documentos PDF
$ pdfgrep -n Mikro[tT]ik invoice*.pdf
invoice-20120033.pdf:2:MikroTik Sextant 5HnD 18dbi MIMO
invoice-20120075.pdf:1:MikroTik RouterBOARD 250GS Giga
Como se ha mencionado m谩s arriba, ssgrep
le ayuda a buscar hojas de c谩lculo. ssgrep
abrevia “spreadsheet grep” y es parte de la Gnum茅rico herramienta. Como formato de archivo, tanto Open / Libre Office Calc como Gnumeric utilizan gzip
XML comprimido como formato de archivo. Las versiones m谩s recientes de Microsoft Excel tambi茅n podr铆an funcionar, pero no lo prob茅. La Figura 1 muestra una hoja de c谩lculo de ejemplo con datos de ventas y cuatro pedidos.
_Figura 1: Ejemplo de hoja de c谩lculo Gnumeric_
Para identificar las celdas individuales que contienen el t茅rmino “NanoStation”, ssgrep
se llama con las opciones -H
y -n
. -H
genera el nombre del archivo como el primer campo de datos, y -n
agrega la ubicaci贸n: el nombre de la hoja de c谩lculo y la posici贸n de la tabla. Consulte el Ejemplo 8 a continuaci贸n para ver la salida.
Ejemplo 8:
$ ssgrep -Hn "Nano[Ss]tation" orders.gnumeric
orders.gnumeric:orders!C3:5x NanoStation M5
orders.gnumeric:orders!C5:4x NanoStation M2
orders.gnumeric:orders!C6:3x NanoStation M3
Las herramientas presentadas hasta ahora son herramientas de l铆nea de comandos. Para buscar documentos de Open / Libre Office, puede usar la herramienta gr谩fica llamada “loook” (paquete Debian loook). La Figura 2 muestra la sencilla interfaz gr谩fica de usuario.
_Figura 2: La interfaz gr谩fica de loook_
Conclusi贸n
La b煤squeda de formatos de datos es compleja y puede ser una historia interminable. Varias herramientas le ayudan a identificar f谩cilmente los archivos relevantes. Para obtener una lista completa de comandos para otros formatos de datos, eche un vistazo a las referencias dadas a continuaci贸n.