Está en la página 1de 7

103.2.

Procesar cadenas de texto por medio de


filtros.

Peso en el examen de certificación: 3 puntos.


Objetivo: Aplicación de filtros a cadenas y flujos de caracteres.

Conceptos y áreas de conocimiento:

.Envío de ficheros y flujos de texto a traves de utilidades de filtros de texto para su


modificación posterior con los comandos incluidos en el paquete de utilidades GNU
"textutils".

Términos y utilidades

• cat

• cut

• expand

• fmt

• head

• od

• join

• nl

• paste

• pr

• sed

• sort

• split

• tail

• tr

• unexpand

• uniq

• wc
103.2.- Procesar cadenas de texto por medio de filtros
103.2.1.- Comandos básicos para mostrar archivos
cat
Muestra el contenido de un archivo de texto, ese es su uso principal. Puede enplearse
como redireccionador de lo que entra por su entrada sstandard y lo envía a su salida
standard, pero eso se verá más adelante (3.4 pipes).

Un ejemplo sería:

$ cat /etc/apt/sources.list

$ cat apuntes.html

tac
Es como cat pero al revés, es decir, muestra el archivo de atŕas hacia adelante, mostrando
las líneas del texto de la última a la primera. Lo da la vuelta como un calcetín. Se emplea
en archivos log (registro de cosas que han acontecido).

Un ejemplo sería:

$ tac /var/log/apt/history.log

En este ejemplo podemos hacer un seguimiento de instalaciones y actualizaciones pero


desde las últimas a las primeras (sentido inverso al archivo, donde lo último se registra al
final).

head
En inglés significa cabeza o cabecera, está claro que nos mostrará el principio de un
archivo de texto, por defecto las 10 primeras lineas.

Tiene dos opciones principales:

-n <nº lineas> Muestra las n primeras líneas


- c muestra los n primeros caracteres.

Un ejemplo sería:

$ head lista.txt -n 5

tail
En inglés significa cola, que es lo contrario de cabeza. Muestra las lineas finales, por
defecto la 10 últimas. Pero mucho ojo , las muestra en su orden correcto , no invierte
el orden como pasaba en tac. Dispone de opciones -n y -c, con significado similar
a head. Además dispone de dos opciones adicionales:

-f muestra las últmimas líneas y todas las nuevas que vayan apareciendo.
Muy útil para archivos log.

+ <nº linea> muetra las líneas a partir del número de linea indicado

Un ejemplo sería:

$ tail /var/log/apt/history.log -n

Nos mostrará la última instalación o actualización de paquetes realizada.


103.2.2.- Comandos para contar u numerar
wc
El comando proviene del término "word counter", contador de palabras. Cuenta líneas,
palabras y caracteres. Dependiendo de la opción que se emplee.

-l cuenta lineas (lines)


-w cuenta palabras (words)
-c cuenta caracteres (char) pero de un byte, por tanto cuenta bytes
-m cuenta caracteres independientemente de si el código es de un byte (ANSI)
u varios (UTF)
Vamos a ver un ejemplo de la opción más comprometida, la de contar caracteres, viendo
la diferencia entre -c y -m. En este ejemplo usamos un archivo UTF-8 con 'ñ' y vocales
acentuadas (que ocupan dos bytes en vez de uno). El contador arroja valores diferentes

$ cat ejemplo.txt
España ha ganado el mundial de fútbol.
El equipo campeón es España.
$ wc ejemplo.txt -c
73 ejemplo.txt
$ wc ejemplo.txt -m
69 ejemplo.txt
En un caso arroja 73 (bytes) que corresponden a 69 caracteres.

nl
Numerador de lineas (numbered lines) Equivalente a cat -b. Con la opción -bt muestra
sólo las lineas que no estén en blanco. No requiere mayor explicación.

103.2.3.- Comandos manejadores de tabuladores


Estos comandos recogen la entrada de un archivo o de la entrada standard y vuelcan el
resultado en la salida estandard. Son estos dos:

expand
Sustituye los tabuladores que aparecen en el archivo por su equivalente en espacios en
blanco. Por defecto emplea 8 espacios, con la opcion -t se puede modificar.

unexpand
Mas o menos lo contrario de expand, sustituye dos o mas espacios en el texto por
tabuladores.

103.2.4.- Comandos para volcado de archivos como números hexadecimales y


otros formatos
hexdumpVuelca el contenido de un archivo binario por la salida standard. Existen diversas
maneras de emplear este comando, la más empleada es -C que hace4 la salida más clara.
Lo que hace es mapear el contenido de un archivo como hexadecimal indicando posiciones
y valores almacenados. Veamos un ejemplo.

$ cat ejemplo.txt
Estaba la pastora, lará lará larito.
$ hexdump ejemplo.txt
0000000 7345 6174 6162 6c20 2061 6170 7473 726f
0000010 2c61 6c20 7261 a1c3 6c20 7261 a1c3 6c20
0000020 7261 7469 2e6f 0a0a
0000028
$ hexdump ejemplo.txt -C
00000000 45 73 74 61 62 61 20 6c 61 20 70 61 73 74 6f 72 |Estaba la pastor|
00000010 61 2c 20 6c 61 72 c3 a1 20 6c 61 72 c3 a1 20 6c |a, lar.. lar.. l|
00000020 61 72 69 74 6f 2e 0a 0a |arito...|
00000028
Como se puede apreciar, permite ver la codificación interna del archivo en hexadecimal,
mostrando que está en UTF-8, donde un caracter a veces son varios bytes.

od
Abreviatura de 'octal dump' vuelca archivos a la salida standard en formato octal. Tiene
diversas opciones para hacer los volcados en otros formatos. Las opciones más comunes
son:

-c hace el volcado a caracteres ASCII


-d en enteros sin signo
-i a enteros (integer)

Un ejemplo con el mismo archivo anterior sería:

$ od ejemplo.txt -c
0000000 E s t a b a l a p a s t o r
0000020 a , l a r 303 241 l a r 303 241 l
0000040 a r i t o . \n \n
0000050
103.2.5.- Comandos para dividir y juntar archivos
split
Corta o trocea un archivo en trozos, de un número de líneas determinado o de un tamaño
determinado. Split como adjetivo se emplea para por ejemplo la leche cuando está
cortada, significa separar.
Se puede trocear el archivo empleando -l y el número de líneas de cada parte o -b y el
tamaño en bytes de cada parte. Pongamos un ejemplo:

$ split -b 1024k cancion.mp3 parte_


Esto genera los archivos:

$ ls parte_*
parte_aa parte_ab parte_ac parte_ad
Estos archivos pueden recomponer una copia del original usando:

$ cat parte_*> copia.mp3

cut
Se emplea en archivos de texto donde en cada linea hay campos separados por un
separador. Corta determinadas columnas del archivo y las muestra por la salida standard.
El separador de campo se espedifica con -d y -f de la posición del campo o campos que
deseamos "cortar". Vamos a ver un ejemplo con el archivo /etc/group que contiene lista de
grupos separados por ":". Vamos a cortar el primer y el tercer campo.

$ cut -d ':' -f 1,3 /etc/group


root:0
daemon:1
bin:2
sys:3
adm:4
tty:5
disk:6
lp:7
mail:8
news:9
uucp:10
man:12
...
Ahora vamos a emplear la opción -c que corta los n primeros caracteres:

$ cut -c 2-6 /etc/group


oot:x
aemon
in:x:
ys:x:
dm:x:
ty:x:
isk:x
...
paste
Combina archivos donde una parte de cada linea está en cada uno de los archivos. En
definitiva monta un archivo donde las columnas proceden de otros archivos.
Vamos a ver un ejemplo con dos archivos de texto, uno con un número en cada línea y
otro con las letras "a", "b" y "c" en cada línea. Este es el resultado de aplicar el comando.

$ paste numeros.txt letras.txt


uno a
dos b
tres c
join
Similar a paste, pero mas potente. Permite especificar campos directamente. Su
significado en inglés podríamos traducirlo como "enrrolarse", o "formar parte de", aunque
en este caso sería más acertado "combinar". Lo que hace es meter datos de un archivo
junto con los de otro pero permite establecer condicciones.
El comando nos permite combinar dos archivos con líneas que contienen campos eligiendo
el orden que ocuparán en el texto resultante, teniendo en cuenta que alguno de los
campos (el que yo elija) de un fichero sea igual a alguno (elegido también) de los campos
del otro fichero a combinar. Vamos "la caña". Hay que tener en cuenta que el puntero
recorre ambos archivos hacia adelante, no volviendo atrás, por tanto los campos a
comparar deben ser en orden ascendente o ascendente.
El formato del comando es join -1 <nº campo> -1 <campo> <archivo uno> < archivo
dos>
Veamos un ejemplo:

$ cat paises
1 España español
2 Francia francés
3 Japón japonés
4 China chino
$ cat abreviaturas
1 ESP
2 FRA
4 CHN
$ join -1 1 -2 1 paises abreviaturas
1 España español ESP
2 Francia francés FRA
4 China chino CHN
En este ejemplo hemos mezclado el archivo países con el archivo abreviaturas
de manera que si el campo primero (el número) de cada archivo era igual se
mezclaran los campos, unos a continuación de los otros. Al no disponer de
abreviatura para japón (4), este no ha salido.

Si deseamos que aparezca primero la abreviatura y luego el país, y nada más,


el comando a aplicar sería:

$ join -1 1 -2 1 -o '2.2 1.2' paises abreviaturas


ESP España
FRA Francia
CHN China
Como puede apreciarse me he sacado de la manga la opción -o, no explicada
antes. la 'o' viene de 'order' y sirve para indicar los campos y el orden en el que
aparecerán, se ponen dos números separados por un punto, el primero el
archivo y el segurndo el campo dentro del archivo.

La utilidad de este comando es para combinar archivos con información sobre


procesos, usuarios, etc , formados por campos donde el primero es un número.
Aparte puede tener muchas otras, por ejemplo para responder correctamente al
cuestionario LPI.
103.2.6.- Comandos para ordenar o modificar
uniq

Este comando muestra el contenido de archivos suprimiendo lineas


secuenciales repetidas. Es decir, líneas iguales consecutivas.

sort
Ordena las lineas de un archivo, puede ser por criterios numéricos o de cadena.
Veamos un ejemplo:

$ cat letra
debajo del olivo
debajo del olivo
debajo del olivo
el sol calienta
debajo el olivo
el sol calienta
debajo del olivo el sol calienta
$ uniq letra
debajo del olivo
el sol calienta
debajo el olivo
el sol calienta
debajo del olivo el sol calienta
Con la opción -u sólo pone las líneas que no se repiten:

$ uniq letra -u
el sol calienta
debajo el olivo
el sol calienta
debajo del olivo el sol calienta
Alguno dirá ¿pero si son dos frases que no paran de repetirse? Si, pero no de
forma secuencial, consecutiva, varias veces seguidas. Ahora se entiende ¿no?
tr
Convierte caracteres del archivo original en otros siguiendo el patrón establecido. El
nombre del comando procede de "translate", traducir. Este comando sólo recoge datos de
la entrada standard, no de archivos directamente, por tanto siempre va detrás de un pipe.
Veamos un ejemplo:

$ echo España ha ganado el mundial| tr '[a-z]' '[A-Z]'


ESPAñA HA GANADO EL MUNDIAL
En este caso tratamos de convertir todo a mayúsculas, pero en el caso del español nos
fallará con los acentos y las 'ñ'.

En este ejemplo vamos a convertir un carácter concreto en varios:

$ echo España| tr '[ñ]' '[gn]'

Espagna

Esto puede ser útil para eliminar eñes en caso de pasar texto a formatos
que no las soportan bien.

103.2.7.- Comandos previos a la impresión


Estos comandos son algo prehistóricos en cierto modo, pensados para impresoras basadas
en caracteres, que debían soportar grandes listados.

fmt
Abreviatura de 'format', modifica el formato a determinado número de caracteres por
línea, pensado para preprocesar la impresión .Configura el texto por defecto a 75
caracteres por linea. Tiene tres opciones:

-w : indica el número de caracteres por línea


-s: divide líneas grandes, pero no las rellena
-u: Establece un espacio entre palabras y dos entre sentencias (por si se nos
quedó la mano pegada en el espaciador)
Veamos un pequeño ejemplo de la última opción (ya sé que ese C no es correcto):

$ cat prueba
printf("Perico los palotes") ;
if else then
$ fmt prueba -u
printf("Perico los palotes") ; if else then
Es importante saber que no actúa con la entrada standard, por tanto no nos lo
encontraremos detrás de un pipe.

pr
Divide el archivo para impresión en páginas de 66 líneas y 72 caracteres de ancho. Tiene
dos opciones:

-l para especificar líneas por página


-w para especificar caracteres por línea
Al ejecutarlo nos genera al menos una página, le añade una cabecera con fecha (formato
año-mes-dia), la hora, el nombre del archivo y la página.

También podría gustarte