2014-02-28

Aprendiendo a Usar el Comando CUT

Para los que trabajamos analizando los registros del sistema o archivos que contengan información tabulada es fundamental aprender a usar comandos que nos permitan extraer información de esos archivos, por esto decidí en esta entrada mostrar algunas cosas que se pueden hacer con el comando CUT, después intentare hacer lo mismo con otros comandos.

Entonces pues primero la imagen de la ayuda que brinda el comando, la cual me parece muy valiosa y clara


Para poder realizar los ejemplos vamos a usar un fragmento de los registros de conexión por publickey a un servidor de SSH, los cuales se ven así

Feb 23 11:06:57 fr sshd[25327]: Accepted publickey for root from 190.26.49.14 port 21698 ssh2
Feb 24 08:24:39 fr sshd[26923]: Accepted publickey for root from 10.201.132.61 port 1727 ssh2
Feb 24 08:53:46 fr sshd[26936]: Accepted publickey for root from 10.201.132.61 port 3135 ssh2
Feb 25 10:16:18 fr sshd[28526]: Accepted publickey for root from 10.201.132.61 port 23819 ssh2
Feb 25 18:12:16 fr sshd[29825]: Accepted publickey for root from 10.201.132.61 port 41020 ssh2
Feb 25 18:12:47 fr sshd[29832]: Accepted publickey for root from 10.201.132.61 port 41022 ssh2
Feb 26 14:00:15 fr sshd[31463]: Accepted publickey for root from 10.201.132.61 port 63469 ssh2
Feb 26 14:12:05 fr sshd[31487]: Accepted publickey for root from 10.200.11.153 port 16539 ssh2
Feb 26 14:15:04 fr sshd[31513]: Accepted publickey for root from 200.21.240.135 port 53538 ssh2
Feb 26 14:18:11 fr sshd[31533]: Accepted publickey for root from 190.68.125.74 port 46271 ssh2
Feb 26 14:27:40 fr sshd[31557]: Accepted publickey for root from 10.201.132.61 port 65024 ssh2
Feb 27 16:45:06 fr sshd[1695]: Accepted publickey for root from 10.200.10.79 port 42335 ssh2
Feb 27 17:22:30 fr sshd[1721]: Accepted publickey for root from 10.201.132.61 port 43805 ssh2

Entonces vamos a iniciar con el más simple, que es sacar un dato usando un delimitador. El delimitador es lo que el usuario defina como separador de cada columna, para este ejemplo voy a identificar el numero de proceso que se ejecuto para cada conexión, para esto necesitamos el numero que esta entre [], lo voy a mostrar por pasos.

La primera parte usaremos como delimitador el [ y que nos muestre la segunda columna, entonces el comando quedaría

root@localhost:~# cut -d [ -f 2 logconexiones
25327]: Accepted publickey for root from 190.26.49.14 port 21698 ssh2
26923]: Accepted publickey for root from 10.201.132.61 port 1727 ssh2
26936]: Accepted publickey for root from 10.201.132.61 port 3135 ssh2
28526]: Accepted publickey for root from 10.201.132.61 port 23819 ssh2
29825]: Accepted publickey for root from 10.201.132.61 port 41020 ssh2
29832]: Accepted publickey for root from 10.201.132.61 port 41022 ssh2
31463]: Accepted publickey for root from 10.201.132.61 port 63469 ssh2
31487]: Accepted publickey for root from 10.200.11.153 port 16539 ssh2
31513]: Accepted publickey for root from 200.21.240.135 port 53538 ssh2
31533]: Accepted publickey for root from 190.68.125.74 port 46271 ssh2
31557]: Accepted publickey for root from 10.201.132.61 port 65024 ssh2
1695]: Accepted publickey for root from 10.200.10.79 port 42335 ssh2
1721]: Accepted publickey for root from 10.201.132.61 port 43805 ssh2

Como solo necesitamos el número, entonces necesitamos otro corte en el archivo, por lo que el comando final quedaría así

root@localhost:~# cut -d [ -f 2 logconexiones | cut -d ] -f 1
25327
26923
26936
28526
29825
29832
31463
31487
31513
31533
31557
1695
1721

Otro ejemplo que puede ser útil es sacar fecha e IP de conexión, para lo que podemos usar como delimitador los espacios y que nos muestre las comunas que necesitamos, que serian de la 1 a la 3 y además la 11, entonces el comando quedaría

root@localhost:~# cut -d " " -f 1-3,11 logconexiones
Feb 23 11:06:57 190.26.49.14
Feb 24 08:24:39 10.201.132.61
Feb 24 08:53:46 10.201.132.61
Feb 25 10:16:18 10.201.132.61
Feb 25 18:12:16 10.201.132.61
Feb 25 18:12:47 10.201.132.61
Feb 26 14:00:15 10.201.132.61
Feb 26 14:12:05 10.200.11.153
Feb 26 14:15:04 200.21.240.135
Feb 26 14:18:11 190.68.125.74
Feb 26 14:27:40 10.201.132.61
Feb 27 16:45:06 10.200.10.79
Feb 27 17:22:30 10.201.132.61

Cuando el archivo que estás analizando no esta tan tabulado es complicado extraer esos datos tan fácilmente o si lo que se necesita es saber cual es el valor de la columna X de un archivo el comando CUT tiene la opción C que te permite que cada letra se convierta en una columna y extraigas solo las que necesitas.

Para el ejemplo vamos a sacar el contenido de las columnas desde la 70 a la 80, por lo que el comando quedaría así

root@localhost:~# cut -c 70-80 logconexiones
190.26.49.1
10.201.132.
10.201.132.
10.201.132.
10.201.132.
10.201.132.
10.201.132.
10.200.11.1
200.21.240.
190.68.125.
10.201.132.
0.200.10.79
0.201.132.6

Ahora si lo que necesita es extraer los datos desde la columna X hasta el final de linea solo se debe retirar del comando el limite final, o sea así:

root@localhost:~# cut -c 70- logconexiones
190.26.49.14 port 21698 ssh2
10.201.132.61 port 1727 ssh2
10.201.132.61 port 3135 ssh2
10.201.132.61 port 23819 ssh2
10.201.132.61 port 41020 ssh2
10.201.132.61 port 41022 ssh2
10.201.132.61 port 63469 ssh2
10.200.11.153 port 16539 ssh2
200.21.240.135 port 53538 ssh2
190.68.125.74 port 46271 ssh2
10.201.132.61 port 65024 ssh2
0.200.10.79 port 42335 ssh2
0.201.132.61 port 43805 ssh2

Si lo que necesita es desde el principio de la linea hasta una columna X entonces solo debe retirar el limite inicial, o sea así:

root@localhost:~# cut -c -10 logconexiones
Feb 23 11:06:57 fr
Feb 24 08:24:39 fr
Feb 24 08:53:46 fr
Feb 25 10:16:18 fr
Feb 25 18:12:16 fr
Feb 25 18:12:47 fr
Feb 26 14:00:15 fr
Feb 26 14:12:05 fr
Feb 26 14:15:04 fr
Feb 26 14:18:11 fr
Feb 26 14:27:40 fr
Feb 27 16:45:06 fr
Feb 27 17:22:30 fr
Feb 27 17:23:20 fr

Espero les sea útil