howtos/Linux/grep ejemplos.txt

227 lines
12 KiB
Plaintext

Sintaxis del comando grep
El comando grep espera un patrón y argumentos opcionales junto con una lista de archivos si se usa sin tubería.
$ grep [options] pattern [files]
Un ejemplo sencillo es:
$ grep my file.txt
my_file
$
---BUSCAR LO QUE EMPIECE POR '^\'
Con la expresión '^\[privi' busca todo lo que empieza por privi:
grep '^\[privi' .ansible.cfg
---Searching Multiple Files
grep le permite buscar el patrón dado no solo en uno sino en varios archivos. A continuación, le mostramos cómo puede buscar un patrón en varios archivos utilizando * comodín.
$ sudo grep -i [pattern] [files]
Salida:
$ sudo grep err /var/log/messages*
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
/var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
/var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
$
Puede observar en la salida anterior que el nombre del archivo se imprime primero antes de imprimir la línea correspondiente para indicar dónde grep encontró el patrón dado.
---Case Insensitive Search
grep ofrece buscar un patrón sin mirar el caso del patrón. Usar -i bandera para decirle a grep que ignore las mayúsculas y minúsculas.
$ grep -i [pattern] [file]
Salida:
$ grep -i it text_file.txt
This is a sample text file. It contains
functionality. You can always use grep with any
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$
---Whole Word Search
No siempre queremos una coincidencia parcial, sino que esperamos que grep coincida solo con una palabra completa. Puedes hacer eso con -w bandera.
$ grep -w [pattern] [file]
Salida:
$ grep -w is text_file.txt
This is a sample text file. It contains
This is a sample text file. It's repeated two times.
$
---Check Match Count
A veces, en lugar de la línea coincidente real, solo necesitamos el recuento de coincidencias exitosas que hizo grep. Podemos obtener este recuento usando -c .
$ grep -c [pattern] [file]
Salida:
$ grep -c is text_file.txt
2
$
---Search Sub-directories
A menudo es necesario buscar archivos no solo en el directorio de trabajo actual, sino también en subdirectorios. grep te permite hacer eso fácilmente con -r bandera.
$ grep -r [pattern] *
Salida:
$ grep -r Hello *
dir1/file1.txt:Hello One
dir1/file2.txt:Hello Two
dir1/file3.txt:Hello Three
$
Como puede observar, grep recorre cada subdirectorio dentro de un directorio actual y enumera los archivos y líneas donde se encuentra una coincidencia.
---Inverse Search
Si desea encontrar algo que no coincida con un patrón dado, grep permite hacerlo con -v bandera.
$ grep -v [pattern] [file]
Salida:
$ grep This text_file.txt
This is a sample text file. It contains
This is a sample text file. It's repeated two times.
$ grep -v This text_file.txt
several lines to be used as part of testing grep
functionality. You can always use grep with any
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
$
Puede comparar la salida de grep comando en el mismo patrón y archivo con y sin -v bandera. Con -v, se imprimen las líneas que no coincidan con el patrón.
---Print Line Numbers
grep le permite imprimir números de línea junto con líneas impresas, lo que facilita saber dónde está la línea en el archivo. Usar -n opción como se muestra para obtener números de línea en la salida.
$ grep -n [pattern] [file]
Salida:
$ grep -n This text_file.txt
1:This is a sample text file. It contains
7:This is a sample text file. It's repeated two times.
$
---Limit grep Output
Para archivos grandes, como registros, etc., la salida grep puede ser larga y es posible que solo necesite un número fijo de líneas en la salida en lugar de hacer coincidir todo. Nosotros podemos usar -m[num] para limitar las líneas impresas por núm. He aquí cómo usarlo:
$ grep -m[num] [pattern] [file]
Observe cómo el uso de -m flag afecta la salida de grep para el mismo conjunto de condiciones en el siguiente ejemplo:
$ grep It text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$ grep -m2 It text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
$
---Display Additional Lines
A menudo, no solo necesitamos las líneas que tienen un patrón coincidente, sino algunas líneas arriba o abajo para un mejor contexto.
Es posible imprimir una línea por encima o por debajo (o ambos) de una línea que tiene un patrón usando grep usando -A, -B or -C banderas con num valor. Aquí num indica el número de líneas adicionales que se imprimirán justo encima o debajo de la línea correspondiente. Esto es aplicable a todas las coincidencias que grep encuentra en el archivo o lista de archivos especificados.
$ grep -A[num] [pattern] [file]
# imprime la busqueda y las [num] líneas indicadas posteriores
$ grep -B[num] [pattern] [file]
# imprime la busqueda y las [num] líneas indicadas anteriores
$ grep -C[num] [pattern] [file]
# imprime la busqueda y las [num] líneas indicadas posteriores y anteriores
---List File Names
Para imprimir solo el nombre de los archivos donde se encuentra un patrón en lugar de las líneas realmente coincidentes, use -l bandera.
$ grep -l [pattern] [file]
Aquí hay un ejemplo de ejecución:
$ grep -l su *.txt
file.txt
text_file.txt
$
Print Exact Lines
---A veces necesitamos imprimir líneas que coincidan exactamente con un patrón dado, no con una parte de él. grep permite -x bandera para hacer precisamente eso.
$ grep -x [pattern] [file]
En el siguiente ejemplo, file.txt contiene una línea con una sola palabra "support" y, como tal, grep hace coincidir con -x marca sin tener en cuenta las líneas que pueden contener las palabras "apoyo" junto con otro texto.
$ grep -x support *.txt
file.txt:support
$
---Match Starting String
Usando expresiones regulares, podemos encontrar una cadena al comienzo de una línea. He aquí cómo hacerlo.
$ grep [options] "^[string]" [file]
Ejemplo:
$ grep It text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$ grep ^It text_file.txt
It supports numbers like 1, 2, 3 etc. as well as
$
Observe cómo usar ^ carácter cambia la salida. ^ indica el inicio de la cadena y grep coinciden ^It como cualquier línea que comience con la palabra It. Incluir entre comillas puede ayudar cuando el patrón contiene espacios, etc.
---Match Ending String
Otra expresión regular útil común es hacer coincidir el final del patrón de línea.
$ grep [options] "[string]$" [file]
Ejemplo:
$ grep "\." text_file.txt
This is a sample text file. It contains
functionality. You can always use grep with any
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
This is a sample text file. It's repeated two times.
$ grep "\.$" text_file.txt
kind of data but it works best with text data.
alphabets and special characters like - + * # etc.
This is a sample text file. It's repeated two times.
$
Intentamos igualar un . carácter al final de la línea. Dado que el punto (.) Es un carácter de significado especial, debemos escapar de él con \ personaje. Una vez más, observe cómo varía la salida cuando simplemente hacemos . personaje y cuando usamos $ para instruir a grep para que coincida solo con las líneas que terminan con . (no los que pueden contenerlo en algún lugar intermedio).
---Use Pattern File
Puede haber situaciones en las que tenga una lista compleja de patrones que utilice con frecuencia. En lugar de escribirlo todo el tiempo, puede especificar una lista de patrones en un archivo y usar con -f bandera. El archivo debe contener un patrón por línea.
$ grep -f [pattern_file] [file_to_match]
En nuestro ejemplo, hemos creado nombres de archivos de patrones pattern.txt con los siguientes contenidos:
$ cat pattern.txt
This
It
$
Para usarlo, usa -f bandera.
$ grep -f pattern.txt text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$
---Specify Multiple Patterns
grep permite especificar múltiples patrones usando -e bandera.
$ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file]
Ejemplo:
$ grep -e is -e It -e to text_file.txt
This is a sample text file. It contains
several lines to be used as part of testing grep
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$
Specify Extended RegEx
grep también admite expresiones regulares extendidas o ERE usando -E bandera. Esto es similar a egrep comando en Linux.
El uso de ERE tiene una ventaja cuando desea tratar a los metacaracteres como están y no desea sustituirlos por cadenas como grep. Esto le brinda más flexibilidad en términos de escapar de ellos, como debemos hacer en el caso de grep. Dicho esto, usando -E con grep es equivalente a egrep mando.
$ grep -E '[Extended RegEx]' [file]
Aquí hay un uso de ERE en el que queremos imprimir líneas que no están comentadas o en blanco. Esto es especialmente útil para encontrar algo en archivos de configuración grandes. He usado adicionalmente -v bandera para NO imprimir líneas que coincidan con el patrón '^(#|$)'.
$ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server
$