#4sysadmins

Inicio » GNU/Linux » Uso de grep y sed

Uso de grep y sed

Últimas Entradas

Follow #4sysadmins on WordPress.com

Grep y Sed

En esta entrada vamos a ver parte de las páginas man de los comandos grep y sed, así como algunos ejemplos para entrar en contacto con estas potentes herramientas de búsqueda y flujo de texto.

grep : Busca en archivos cadenas de texto y nos devuelve el nombre del archivo y si además es un archivo de texto nos devolverá la línea que contiene dicho patrón.  La sintaxis de grep es:

grep [opciones] exp_regular [archivos]

Opciones:

  • Si no queremos que nos muestre la línea que contiene el patrón pero si un número que indica cuantas líneas lo contienen: -c, –count
  • Si no queremos hacer distinción entre mayúsculas y minúsculas: -i, –ignore-case
  • Buscar de forma recursiva: -r, –recursive
  • Si en vez de una exp_regular/patrón queremos pasar un archivo con un texto como patrón: -f, –file <archivo> .
  • Para usar expresiones regulares extendidas (que contienen metacaracteres como ?, +, |, {},()) :-E, –extended-regexp . Esto es igual a egrep
  • Si queremos hacer una búsqueda de varias cadenas de texto (opciones diferentes): -F

Nota: grep -F es igual a fgrep. No se permite el uso de expresiones regulares. Las opciones a buscar deben de ir en líneas separadas. El siguiente ejemplo busca trastero o garaje en un archivo de texto

$fgrep trastero
 >garaje archivo.txt
  • Para negar, o buscar todo lo que no coincida: -v
  • Mostrar el número de línea en la cual se ha encontrado el patrón (válido para grep, egrep y fgrep): -n
  • Para mostrar líneas donde el patrón no es parte de una palabra si no una palabra completa: -w
  • Devolver el nombre del archivo en el que se ha encontrado el patrón y no sus líneas: -l

Ejemplos:

Busca de forma recursiva en /etc/ todos los archivos que contienen la palabra eth0 o eth1

$grep -r eth[01] /etc/*

El uso de * implica que pueda haber 0 o mas ‘i’ en palabras que contengan como mínimo ‘da’.

$grep dai* archivo.txt

Usamos la salida de ps como entrada de grep

$ps ax | grep inetd

En este ejemplo recalcaremos varias cosas, como por ejemplo, podríamos haber usado el comando “egrep” que es igual que usar “grep -E”, el entrecomillado de la expresión regular es vital, de lo contrario el shell podría hacer una mala interpretación de los metacaracteres, y para terminar la explicación de que hace en este caso grep: busca en /etc/ archivos que contengan o bien el nombre de host de alberto o de paula y que además contenga el número 15

$grep -E "(alberto\.nebul4ck\.com|paula\.nebul4ck\.es).*15" /etc/*

sed : Es un ‘Stream EDitor’ o editor de flujo que no modifica el contenido del archivo original si no una copia e imprime por pantalla las líneas procesadas o aquellas que han sufrido cambios (esto depende de la opción que le pasemos). La sintaxis de sed es:

sed [-n] [-e comando] [-f archivo-comandos] archivo [> guardar_cambios]

Explicación de la sintaxis:

  • -n : Esta opción hace que no se impriman por pantalla las líneas procesadas. Podemos imprimir solo las que han experimentado modificaciones siempre y cuando utilicemos la bandera ‘flag’ p (print) que veremos a continuación.
  • -e : Con esta opción indicamos que estamos pasando comandos por la línea de comandos y no a través de un archivo. Se puede omitir. Los comandos pueden ir acompañados de banderas que modifican su comportamiento
  • -f archivo-comandos : Podemos indicar comandos desde un archivo (1 por línea)

Comandos sed:

  • d : Elimina las filas
  • p : Imprime las líneas que ha experimentado cambios.
  • q : quit. Recorrer un archivo e imprimir una línea y sale.

Nota: p y q unidos es mas efectivo, ya que no se recorre todo el archivo $ sed -n ‘3{p;q}’ archivo.txt

  • s : sustitución.
  • a\ : Agregar texto
  • i\ : Insertar texto
  • c\ : Cambiar texto
  • r : Leer archivo
  • = : Muestra el número de línea donde se encontró el patrón.

Podemos pasar varios comandos separados por ‘;‘ :

$sed -n 's/antiguos/MODIFICADO/g;p;=' archivo.txt
  • O agrupados por ‘{}‘ cuyo uso es mas habitual en archivos de comandos sed :
$sed -n '{ s/antiguos/MODIFICADO/g; {p; {=; }}}' archivo.txt

Pasar varios comandos desde un script sed:

$cat script.sed
s/antiguos/MODIFICADO/g
p
=
$ sed -n -f script.sed archivo.txt

Vamos a ver el uso de los comandos sed:

  • Sustituir patron1 por patron2. Por defecto sed solo sustituirá la primera coincidencia de cada línea. Si añadimos una g final sustituirá todas las coincidencias de todas las líneas.
sed s/patrón1/patrón2/g archivo.txtx
  • Si queremos solo sustituir la tercera coincidencia de una linea:
sed s3/patron1/patrón2 archivo.txt
  • Si por el contrario queremos sustituir la primera coincidencia de patrón1 en la tercera línea:
sed 3s/patrón1/patrón2 archivo.txt
  • Podemos sustituir todas las coincidencias de patrón 1 que ocurran desde la línea 5 a la línea 9:
sed 5-9s/patron1/patron2/g archivo.txt

Nota: Podríamos haber usado d y hubiésemos eliminado las líneas donde se hubiesen encontrado patrón 1, si ademas de la g añadimos la p (print) y la acompañamos con la opción -n de sed, hubiésemos imprimido por pantalla solo las líneas afectadas.

  • Indicar líneas mediante patrones en vez de número:
sed /palabra_inicio/./palabra_final/s/patrón1/patrón2/g archivo.txt

En este caso sed  busca ‘palabra-inicio‘ y empezará a sustituir patrón1 por patrón2 hasta que encuentre ‘palabra_final‘. Tras leer la línea con ‘palabra_finalsed proseguirá en búsqueda de una nueva línea que contenga ‘palabra_inicio‘ repetirá su comportamiento sucesivamente hasta terminar el archivo.

Nota: Si a este comando le añadimos la opción -n pasará algo curioso, y es que si no se encuentra ninguna línea con ‘palabra_inicio‘ no se imprimirá nada, por el contrario si se encuentran líneas con ‘palabra_inicio‘ pero ninguna con ‘palabra_final‘ , se imprimirán todas. Esto es por el flujo de texto que sigue sed en su búfer, él sabe que ha encontrado, pero no lo que va a o no va a encontrar.

Cuando usamos los comandos sed dentro de un un archivo de comandos podemos usar la bandera w para guardar las líneas modificadas en un archivo:

s/patrón1/patrón2/w archivo_salida
  •  Añade la palabra Mundo a la 4º línea de archivo.txt después de la línea o patrón especificado:
$ sed '/3/ a\ Mundo' archivo.txt

Nota: Si empleamos la dirección /3/, sed añadirá el texto cada 3 líneas, si usamos 3 a secas, solo lo añadirá una vez en la cuarta línea. Pasa lo mismo con i\ y c\

  • Añade la palabra Mundo a la 4º línea de archivo.txt antes de la línea especificada:
$ sed '/5/ i\ Mundo' archivo.txt
  • Esta línea va a sustituir a la línea que contiene a ‘Antigua‘ en archivo.txt
$ sed  '/Antigua/ c\' archivo.txt
  • Agrega al final de cada archivo coincidente con ‘fich*.txt‘ el contenido de firma.txt
$ sed -s '$ r firma.txt' fich*.txt
  • Mostrar el número de línea donde se encontró patrón
$ sed -n '/patron/=' archivo.txt

Otros ejemplos para limitar líneas:

  • Eliminar las líneas 1,2,3,4 y 5 del archivo inventario.txt
$sed '1,5d' inventario.txt
  • Efectúa cambios de la línea 23 a la última del archivo.
$sed '23,$s/patrón1/patrón2/g archivo
  • Indicar que aquellas líneas que comiencen con ‘#‘ no las muestre
$sed '/^#/d' /ruta/mi/archivo.txt
  • Negar una dirección o patrones, no imprimir las líneas 4,5 y 6:
$sed -n '4,6 !p' archivo.txt
  • No imprimirá la línea que contenga el patrón.
$sed -n '/patron/! p' archivo.txt

El uso de &

El uso de & es extremadamente útil a la hora se sustituir texto, con el siguiente ejemplo quedará claro:

$sed 's/ GPL /& (General Public License)/g mi_texto.odt > modificado.odt' : Esto es igual a
's/ GPL /GPL (General Public License)/g'

Algunos Trucos

  • Mientras no se alcance la última línea ($!) imprime el archivo
$sed -n '$! p' archivo.txt
  • Eliminar los espacios al comienzo de cada línea:
$sed '/^ *//g' archivo.txt
  • Sustituir un tabulador por ; :
$sed 's/\t/;/g' archivo.txt
  • Eliminar los saltos de línea (\n, líneas en blanco):
$sed '/./! d' archivo.txt ó sed '/^$/d' archivo.txt ó sed -n '/./ p'
Anuncios

Deja un comentario, Gracias!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: