Típicamente utilizamos el comando cat
para volcar archivos por salida estándar (visualizar rápidamente un archivo de texto plano por pantalla), o tal vez concatenar dos o más archivos en uno. Sin embargo, cat
tiene algunas opciones interesantes, tal vez poco conocidas o utilizadas. Veamos algunos usos especiales de cat que deberían ser conocidos por todo SysAdmin que se precie.
cat
es uno de los utilitarios o comandos esenciales y básicos de todo sistema operativo de la familia Unix, y es provisto en GNU/Linux por el paquete coreutils de GNU. Comúnmente se utiliza para volcar un archivo por salida estándar (en lugar de more
o less
, visores más avanzados que soportan paginado y desplazamiento):
emi@hal9000:~$ cat /usr/share/geany/templates/files/file.php <?php {fileheader} ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>{untitled}</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <meta name="generator" content="{geanyversion}" /> </head> <body> </body> </html>
O también para concatenar (unir) dos o más archivos en uno nuevo:
$ cat archivo1 archivo2 archivo3 > archivo_nuevo
Veamos algunos usos interesantes de cat
que deberían ser conocidos por todo SysAdmin que se precie.
Visualizar números de línea
cat
permite agregar los números de línea a través de la opción -n
:
emi@hal9000:~$ cat -n /usr/share/geany/templates/files/file.php 1 <?php 2 {fileheader} 3 ?> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 5 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 7 8 <head> 9 <title>{untitled}</title> 10 <meta http-equiv="content-type" content="text/html;charset=utf-8" /> 11 <meta name="generator" content="{geanyversion}" /> 12 </head> 13 14 <body> 15 16 </body> 17 18 </html>
Esta funcionalidad tiene algunos usos colaterales, como por ejemplo recuperar o visualizar únicamente una linea específica de un archivo (algo que puede realizarse fácilmente con sed
):
emi@hal9000:~$ cat -n /usr/share/geany/templates/files/file.php | grep ' 5' | cut -f2- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
A su vez, la opción -b
permite omitir as líneas en blanco en la numeración:
emi@hal9000:~$ cat -b /usr/share/geany/templates/files/file.php 1 <?php 2 {fileheader} 3 ?> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 5 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 7 <head> 8 <title>{untitled}</title> 9 <meta http-equiv="content-type" content="text/html;charset=utf-8" /> 10 <meta name="generator" content="{geanyversion}" /> 11 </head> 12 <body> 13 14 </body> 15 </html>
Visualizar caracteres de control
Existen diversas opciones para visualizar caracteres de control como tabs (-t
o -vT
), fin de línea (-e
o -vE
) y el resto de caracteres no imprimibles (-v
).
También se dispone de la opción -A
para mostrar todos (equivalente a -vET
):
emi@hal9000:~$ cat -A /usr/share/geany/templates/files/file.php <?php$ {fileheader}$ ?>$ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"$ ^I"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">$ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">$ $ <head>$ ^I<title>{untitled}</title>$ ^I<meta http-equiv="content-type" content="text/html;charset=utf-8" />$ ^I<meta name="generator" content="{geanyversion}" />$ </head>$ $ <body>$ ^I$ </body>$ $ </html>$
Los tabs se reemplazan por la secuencia de caracteres ^I
, mientras que los fin de línea con $
.
Suprimir líneas en blanco repetidas
La opción -s
permite omitir las líneas en blanco repetidas en la salida. Por ejemplo:
emi@hal9000:~$ echo -e "hola \n\n\n\nchau" | cat hola chau emi@hal9000:~$ echo -e "hola \n\n\n\nchau" | cat -s hola chau
Finalmente, vale saber que el paquete coreutils
cuenta con el comando tac
equivalente, el cual permite imprimir líneas en orden reverso (no a nivel línea sino a nivel archivo, desde la última línea a la primera).