Usando grep (y egrep) con expresiones regulares

Using Grep With Regular Expressions



Este tutorial describe cómo usar ambos sujeción (y garza) t o buscar texto en archivos, en su forma simple y cuando se combina con expresiones regulares. Contiene varios ejemplos y ejercicios , Más soluciones , para que el espectador lo complete.

El nombre sujeción proviene del comando ed (y vim) g / re / p, lo que significa buscar globalmente una expresión regular dada e imprimir (mostrar) la salida.







Regular Expresiones

Las utilidades permiten al usuario buscar en archivos de texto líneas que coincidan con una expresión regular ( regexp ). Una expresión regular es una cadena de búsqueda formada por texto y uno o más de 11 caracteres especiales. Un ejemplo simple es hacer coincidir el comienzo de una línea.



Archivo de muestra

La forma básica de sujeción se puede utilizar para buscar texto simple dentro de un archivo o archivos en particular. Para probar los ejemplos, primero cree el archivo de muestra.



Utilice un editor como nano o vim para copiar el texto a continuación en un archivo llamado mi archivo .





xyz
xyzde
exyzd
dexyz
d? gxyz
xxz
xzz
x z
x * z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz

Aunque puede copiar y pegar los ejemplos en el texto (tenga en cuenta que es posible que las comillas dobles no se copien correctamente), los comandos deben escribirse para aprenderlos correctamente.

Antes de probar los ejemplos, vea el archivo de muestra:



$gatomi archivo

Búsqueda simple

Para encontrar el texto 'xyz' dentro del archivo, ejecute lo siguiente:

$sujeciónxyz myfile

Usando colores

Para mostrar colores, use –color (un guión doble) o simplemente cree un alias. Por ejemplo:

$sujeción --colorxyz myfile

o

$alias sujeción=’sujeción--color’
$sujeciónxyz myfile

Opciones

Opciones comunes utilizadas con el sujeción comando incluye:

  • -encontré todas las líneas desconsiderado de caso
  • -c contar cuántas líneas contienen el texto
  • -n línea de visualización números de líneas coincidentes
  • -l solo visualización expediente nombres ese partido
  • -r recursivo búsqueda de subdirectorios
  • -v encontrar todas las líneas NO que contiene el texto

Por ejemplo:

$sujeción -Ixyz myfile# buscar texto independientemente del caso

$sujeción -icxyz myfile# contar líneas con texto

$sujeción -enxyz myfile# mostrar números de línea

Crear varios archivos

Antes de intentar buscar varios archivos, primero cree varios archivos nuevos:

$echoxyz>myfile1
$echo -Yxyz nxzz nXYZ>myfile2
$echo -Yxxx nyyy>myfile3
$gatomyfile1
$gatomyfile2
$gatomyfile3

Buscar varios archivos

Para buscar varios archivos usando nombres de archivo o un comodín, ingrese:

$sujeción -icxyz myfile myfile1 myfile2 myfile3
$sujeción -enxyz mi*
# nombres de archivo coincidentes que comienzan con 'mi'

Ejercicio I

  1. Primero cuente cuántas líneas hay en el archivo / etc / passwd.
Sugerencia: useWC -los /etc/passwd
  1. Ahora busque todas las apariciones del texto dónde en el archivo / etc / passwd .
  2. Encuentre cuántas líneas en el archivo contienen el texto
  3. Encuentra cuántas líneas NO contienen el texto dónde .
  4. Busque la entrada para su inicio de sesión en el / etc / passwd

Las soluciones de ejercicio se pueden encontrar al final de este artículo.

Usar expresiones regulares

El comando sujeción también se puede usar con expresiones regulares usando uno o más de once caracteres especiales o símbolos para refinar la búsqueda. Una expresión regular es una cadena de caracteres que incluye caracteres especiales para permitir la coincidencia de patrones dentro de utilidades como sujeción , yo vine y sed . Tenga en cuenta que es posible que las cadenas deban ir entre comillas.

Los caracteres especiales disponibles incluyen:

^ Inicio de una línea
$ Fin de línea
. Cualquier carácter (excepto n nueva línea)
* 0 o más de la expresión anterior
Anteponer un símbolo, se convierte en un carácter literal.

Tenga en cuenta que el *, que puede usarse en la línea de comando para coincidir con cualquier número de caracteres, incluido ninguno, es no utilizado de la misma manera aquí.

También tenga en cuenta el uso de comillas en los siguientes ejemplos.

Ejemplos de

Para encontrar todas las líneas que comienzan con texto usando el carácter ^:

$sujeción'^ Xyz' miarchivo

Para encontrar todas las líneas que terminan con texto usando el carácter $:

$sujeción'Xyz $' myfile

Para buscar líneas que contengan una cadena con caracteres ^ y $:

$sujeción'^ Xyz $' miarchivo

Para encontrar líneas usando el . para que coincida con cualquier carácter:

$sujeción'^ X.z' miarchivo

Para buscar líneas usando el * para que coincida con 0 o más de la expresión anterior:

$sujeción‘^ Xy*z ’myfile

Para buscar líneas usando. * Para que coincida con 0 o más de cualquier carácter:

$sujeción‘^x.*z ’myfile

Para encontrar líneas usando el para escapar del carácter *:

$sujeción‘^x*z ’myfile

Para encontrar el uso del carácter :

$sujeción'\' mi archivo

Expresión grep - egrep

los sujeción El comando admite solo un subconjunto de las expresiones regulares disponibles. Sin embargo, el comando garza:

  • permite el uso completo de todas las expresiones regulares
  • puede buscar simultáneamente más de una expresión

Tenga en cuenta que las expresiones deben ir entre comillas.

Para usar colores, use –color o cree nuevamente un alias:

$alias garza='egrep --color'

Para buscar más de uno regex los garza El comando puede escribirse en varias líneas. Sin embargo, esto también se puede hacer usando estos caracteres especiales:

| Alternancia, ya sea una u otra
(…) Agrupación lógica de parte de una expresión
$garza '(^ raíz | ^ uucp | ^ correo)' /etc/passwd

Esto extrae las líneas que comienzan con root, uucp o mail del archivo, el | símbolo que significa cualquiera de las opciones.

El siguiente comando no funciona, aunque no se muestra ningún mensaje, ya que el básico sujeción El comando no admite todas las expresiones regulares:

$sujeción '(^ raíz | ^ uucp | ^ correo)' /etc/passwd

Sin embargo, en la mayoría de los sistemas Linux, el comando grep -E es lo mismo que usar garza :

$sujeción -Y '(^ raíz | ^ uucp | ^ correo)' /etc/passwd

Usar filtros

Tubería es el proceso de enviar la salida de un comando como entrada a otro comando y es una de las herramientas de Linux más poderosas disponibles.

Los comandos que aparecen en una canalización a menudo se denominan filtros, ya que en muchos casos examinan o modifican la entrada que se les pasa antes de enviar la secuencia modificada a la salida estándar.

En el siguiente ejemplo, la salida estándar de ls -l se pasa como entrada estándar al sujeción mando. Salida del sujeción El comando se pasa luego como entrada al más mando.

Esto mostrará solo directorios en /etc :

$ls -los /etc|sujeción'^ D'|más

Los siguientes comandos son ejemplos de uso de filtros:

$ps -ef|sujecióncron

$OMS|sujeciónkdm

Archivo de muestra

Para probar el ejercicio de revisión, primero cree el siguiente archivo de muestra.

Utilice un editor como nano o vim para copiar el texto a continuación en un archivo llamado gente:

Personal J.Smith 25000
Personal E.Smith 25400
Entrenamiento A.Brown 27500
Entrenamiento C.Browen 23400
(Administrador) R.Bron 30500
Goodsout T.Smyth 30000
Personal F.Jones 25000
formación * C.Evans 25500
Goodsout W.Pope 30400
Planta baja T.Smythe 30500
Personal J.Maler 33000

Ejercicio II

  1. Mostrar el archivo gente y examinar su contenido.
  2. Encuentra todas las líneas que contienen la cadena Herrero en el archivo people. Sugerencia: use el comando grep pero recuerde que, por defecto, distingue entre mayúsculas y minúsculas.
  3. Cree un nuevo archivo, npeople, que contenga todas las líneas que comiencen con la cadena Personal en el archivo de personas. Sugerencia: use el comando grep con>.
  4. Confirme el contenido del archivo npeople enumerando el archivo.
  5. Ahora agregue todas las líneas donde el texto termina con la cadena 500 en el archivo people al archivo npeople. Sugerencia: use el comando grep con >>.
  6. Nuevamente, confirme el contenido del archivo npeople enumerando el archivo.
  7. Busque la dirección IP del servidor que está almacenada en el archivo / etc / hosts Sugerencia: use el comando grep con $ (nombre de host)
  8. Usar garza para extraer de la / etc / passwd líneas de cuenta de archivo que contienen lp o el tuyo ID de usuario .

Las soluciones de ejercicio se pueden encontrar al final de este artículo.

Expresiones más regulares

Una expresión regular se puede considerar como comodines con esteroides.

Hay once caracteres con significados especiales: los corchetes de apertura y cierre [], la barra invertida , el signo de intercalación ^, el signo de dólar $, el punto o punto., La barra vertical o el símbolo de tubería |, el signo de interrogación?, El asterisco o estrella *, el signo más + y el corchete de apertura y cierre {}. Estos caracteres especiales también se denominan a menudo metacaracteres.

Aquí está el conjunto completo de caracteres especiales:

^ Inicio de una línea
$ Fin de línea
. Cualquier carácter (excepto n nueva línea)
* 0 o más de la expresión anterior
| Alternancia, ya sea una u otra
[…] Conjunto explícito de caracteres para coincidir
+ 1 o más de la expresión anterior
? 0 o 1 de la expresión anterior
Anteponer un símbolo, se convierte en un carácter literal.
{…} Notación cuantificadora explícita
(…) Agrupación lógica de parte de una expresión

La versión predeterminada de sujeción solo tiene soporte limitado para expresiones regulares. Para que funcionen todos los ejemplos siguientes, utilice garza en su lugar o grep -E .

Para encontrar líneas usando el | para que coincida con cualquiera de las expresiones:

$garza'Xxz|xzz ’myfile

Para encontrar líneas usando | para hacer coincidir cualquiera de las expresiones dentro de una cadena, también use ():

$garza‘^x(Yz|yz)' mi archivo

Para buscar líneas usando [] para que coincida con cualquier carácter:

$garza‘^x[Yy]z ’myfile

Para buscar líneas usando [] para NO coincidir con ningún carácter:

$garza‘^x[^Yy]z ’myfile

Para buscar líneas usando el * para que coincida con 0 o más de la expresión anterior:

$garza‘^ Xy*z ’myfile

Para buscar líneas usando + para que coincida con 1 o más de la expresión anterior:

$garza'^ Xy + z' miarchivo

Para encontrar líneas usando el? para que coincida con 0 o 1 de la expresión anterior:

$garza'^ Xy? Z' mi archivo

Ejercicio III

  1. Encuentra todas las líneas que contienen los nombres Evans o pintor en el archivo de personas.
  2. Encuentra todas las líneas que contienen los nombres Smith, Smyth o Smythe en el archivo de personas.
  3. Encuentra todas las líneas que contienen los nombres Marrón, marrón o Fuente en el archivo gente. Si tienes tiempo:
  4. Encuentra la línea que contiene la cadena (administración), incluyendo los corchetes, en el archivo personas.
  5. Busque la línea que contiene el carácter * en el archivo personas.
  6. Combine 5 y 6 arriba para encontrar ambas expresiones.

Más ejemplos

Para encontrar líneas usando . y * para coincidir con cualquier conjunto de caracteres:

$garza'^ Xy.*z ’myfile

Para buscar líneas usando {} para hacer coincidir N número de caracteres:

$garza‘^ Xy{3}z ’myfile
$garza‘^ Xy{4}z ’myfile

Para buscar líneas usando {} para hacer coincidir N o más veces:

$garza‘^ Xy{3,}z ’myfile

Para buscar líneas usando {} para hacer coincidir N veces pero no más de M veces:

$garza‘^ Xy{2,3}z ’myfile

Conclusión

En este tutorial, primero vimos el uso de sujeción en su forma simple para buscar texto en un archivo o en varios archivos. Luego combinamos el texto a buscar con expresiones regulares simples y luego más complejas usando garza .

Próximos pasos

Espero que haga un buen uso de los conocimientos adquiridos aquí. Poner a prueba o probar sujeción comandos en sus propios datos y recuerde, las expresiones regulares como se describe aquí se pueden utilizar en la misma forma en nosotros , sed y awk !

Soluciones de ejercicio

Ejercicio I

Primero cuente cuántas líneas hay en el archivo / etc / passwd .
|_+_|
Ahora busque todas las apariciones del texto dónde en el archivo / etc / passwd.
|_+_|
Encuentre cuántas líneas en el archivo contienen el texto dónde

sujeción -cdónde/etc/passwd

Encuentra cuántas líneas NO contienen el texto dónde .

sujeción -cvdónde/etc/passwd

Busque la entrada para su inicio de sesión en el / etc / passwd expediente
|_+_|

Ejercicio II

Mostrar el archivo gente y examinar su contenido.
|_+_|
Encuentra todas las líneas que contienen la cadena Herrero en el archivo gente .
|_+_|
Crea un nuevo archivo, npersonas , que contiene todas las líneas que comienzan con la cadena Personal en el gente expediente
|_+_|
Confirmar el contenido del archivo npersonas enumerando el archivo.
|_+_|
Ahora agregue todas las líneas donde el texto termina con la cadena 500 en el archivo gente al archivo npersonas .
|_+_|
Nuevamente, confirme el contenido del archivo. npersonas enumerando el archivo.
|_+_|
Busque la dirección IP del servidor que está almacenada en el archivo / etc / hosts .
|_+_|
Usar garza para extraer de la / etc / passwd líneas de cuenta de archivo que contienen lp o su propia identificación de usuario.
|_+_|

Ejercicio III

Encuentra todas las líneas que contienen los nombres Evans o pintor en el archivo gente .
|_+_|
Encuentra todas las líneas que contienen los nombres Herrero , Smyth o Smythe en el archivo gente .
|_+_|
Encuentra todas las líneas que contienen los nombres marrón , Browen o Fuente en el archivo de personas.
|_+_|
Encuentra la línea que contiene la cadena (administración), incluyendo los corchetes, en el archivo gente .

$garza '(Administración)'gente

Encuentra la línea que contiene el personaje * en el archivo de personas.
|_+_|
Combine 5 y 6 arriba para encontrar ambas expresiones.

$garza ' (Admin ) | *'gente