domingo, 1 de febrero de 2009

Comandos grep y sed

grep y sed son dos comandos que usan REGEXP

grep

Busca en ficheros por un patrón determinado
grep [opciones] patrón [fichero...]
Opciones:
  • -E o egrep: usa expresiones regulares extendidas
  • -F o fgrep: interpreta los patrones no como expresiones regulares sino como cadenas de caracteres fijas
  • -R o rgrep: lee todos los ficheros bajo cada directorio, recursivamente
  • -i o --ignore-case: busca ignorando diferencias entre mayúsculas y minúsculas
  • -w o --word-regexp: para forzar que la cadena reconocida sea una palabra completa
  • -l o --files-with-matches: no muestra el contenido de la linea encontrada pero si que muestra el fichero que contiene la cadena buscada
  • -n o --line-number: muestra el número de línea dentro del fichero
  • -v o --invert-match: en lugar de sacar la lineas que cumplen la búsqueda sacará las que no cumplen
Si no especificamos fichero, grep usa la entrada estándar:
  • podemos usarlo para probar las expresiones regulares:
    $ egrep ´[Uu]nix´
    unix
    unix
    Unix
    Unix
    Linux

sed (stream editor)

Editor de flujo; permite realizar transformaciones básicas de un flujo de entrada (un fichero o una entrada desde una tubería)

Formato (para substituciones):

sed [opciones] s/REGEXP/reemplazo/flag [fichero]
Algunos comandos:
  • s substitución
  • d borrado
  • i\, a\, añade antes/después de la línea afectada
  • c\ reemplaza la línea afectada
Algunas ociones:
  • -e comando: añade comando
  • -i edita el fichero in-place
  • -n suprime la salida
Algunos flags:
  • g: aplica los cambios globalmente (por defecto, sólo se cambia la primera aparición en cada línea)
  • p imprime las líneas afectadas, incluso con la opción -n.
  • NUMERO: reemplaza la aparición número NUMERO
  • w fichero: escribe las líneas con sustituciones al fichero indicado
Ejemplo: cambia, en el fichero amigos, todas las apariciones de pepe y paco por Pepe y Paco, respectivamente:
$ sed -e ´s/pepe/Pepe/g´ -e ´s/paco/Paco/g´ amigos (también sed ´s/pepe/Pepe/g ; s/paco/Paco/g´ amigos)
Ejemplo: cambia pepe por Pepe, pero sólo en las líneas que tengan Potamo
$ sed ´/Potamo/s/pepe/Pepe/g´ amigos
Ejemplo: muestra sólo las lineas que contengan jaime
$ sed -n ´/jaime/p´ amigos
Ejemplo: borra las lineas que contengan jaime
$ sed ´/jaime/d´ amigos
Ejemplo: cambia las lineas que contengan jaime por otra cosa
$ sed ´/jaime/c\BORRADO´ amigos
Ejemplo: inserta una línea antes de las líneas que contengan jaime por otra cosa
$ sed ´/jaime/i\APARICION´ amigos
Ejemplo: reemplaza, en cada línea de fichero, la quinta ocurrencia de stop por STOP
$ sed ´s/stop/STOP/5´ fichero
Ejemplo: igual que antes pero guarda cada línea reemplazada en el fichero f2
$ sed ´s/stop/STOP/5w f2´ fichero

Indicación de líneas:

podemos especificar las líneas del fichero en las que queremos que se realicen las operaciones:
sed ´3s/stop/STOP/g´ (reemplaza sólo en la línea 3)
sed ´3,10s/stop/STOP/g´ (reemplaza de la línea 3 a la 10)
sed ´3,$s/stop/STOP/g´ (reemplaza de la línea 3 al final)
sed ´!3s/stop/STOP/g´ (reemplaza en todas las líneas menos la 3)

Operador &:

se sustituye por el patrón reconocido

Ejemplo: reemplaza stop por

$ sed ´3s/stop/<&>/g´ fichero

Comandos desde fichero:

la opción -f permite leer comandos de sed agrupados en un fichero

Ejemplo: reemplazo desde la línea 1 hasta una línea que comience por END (o el final, si no hay ninguna)

$ cat file.sed
1,/^END/{
s/[Ll]inux/GNU\/Linux/g
s/samba/Samba/g
}

$ sed -f file.sed fichero