Comandos básicos de Linux con los filtros de texto

En algunos de los comandos que he ejecutado en capítulos anteriores he utilizado tuberías con comandos como grepsort para obtener una vista modificada del comando original.

Búsqueda de cadenas de texto con el comando grep

Utilizaremos comando grep para encontrar un texto dentro de un fichero o en la salida de un comando.

Imaginemos que tenemos un fichero que contiene algunos nombres:

# cat nombres.txt 
David 
Silvia 
Javi 
Alberto 
#

Ahora queremos conocer si ese fichero contiene «Javi»:

# grep Javi nombres.txt 
Javi 
#

Si miramos el man del comando grep, observaremos que tiene unos cuantos parámetros. Yo utilizo mucho «-i» para que no tenga en cuenta las mayúsculas. El comando anterior habría funcionado igual si hubiese escrito «grep -i javi nombres.txt» o si hubiese escrito «grep -i JaV».

Con el parámetro «-v» excluimos un resultado. Es decir, que muestro todos los resultados excepto el filtrado:

# grep -v Javi nombres.txt 
David 
Silvia 
Alberto 
#

Tal y como comentaba al principio, también podemos user grep como una tubería:

[root@prt53ws1 ~]# ls -la |grep cfg
-rw-------. 1 root root 6913 May 1 21:10 anaconda-ks.cfg
-rw-------. 1 root root 6580 May 1 21:10 original-ks.cfg
[root@prt53ws1 ~]#

Uno de los filtros que utilizo mucho es este:

grep -v "^$" archivo.txt > archivo_nuevo.txt

Consigo eliminar las líneas en blanco y redirigir el resultado a un archivo de texto.

Si queremos mostrar en qué línea se encuentra la palabra que estamos buscando, utilizaremos el parámetro «-n» con grep.

grep -n palabra fichero.txt

[root@prt53ws1 ~]# grep -n Logins rename_tables.sh
75:wp_wfLogins
[root@prt53ws1 ~]#

Si queremos ver la línea encontrada con grep y las siguientes cuatro, utilizaremos el parámetro «-A 4» (after). Ejemplo:

[root@lremdox2 ~]# multipath -ll |grep mpathbj  -A 4
mpathbj (360002ac0000000000000009f000206ca) dm-37 3PARdata,VV
size=900G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
  |- 1:0:6:0 sdl  8:176  active ready running
  `- 2:0:6:0 sdw  65:96  active ready running
[root@lremdox2 ~]#

Con «-B 4» (before) veríamos las cuatro líneas anteriores.

Ordenar cadenas de texto con el comando sort de Linux

Para ordenar alfabéticamente un fichero de texto o el resultado de un comando, utilizaremos «sort».

# sort -d nombres.txt 
Alberto 
David 
Javi 
Silvia 
#

También podemos ordenar por el número de columna. Por ejemplo, para ordenar los cinco ficheros por su tamaño, ejecutaremos:

[root@prt53ws1 ~]# ls -la |sort -rnk5 |head -5
-rw-------. 1 root root 11213 Oct 11 06:33 .bash_history
-rw-------. 1 root root 6913 May 1 21:10 anaconda-ks.cfg
-rw-------. 1 root root 6580 May 1 21:10 original-ks.cfg
-rw------- 1 root root 1024 Sep 20 07:06 .rnd
dr-xr-xr-x. 18 root root 255 Sep 19 16:09 ..
[root@prt53ws1 ~]#

La columna cinco es la marcada en negrita.

Eliminar las líneas repetidas de un texto con el comando uniq de Linux

Si solamente nos interesa obtener los resultados diferentes de un texto o de la salida de un comando, utilizaremos el comando «uniq».

Como vemos «David» está repetido dos veces:

# cat nombres.txt 
David 
Silvia 
Javi 
Alberto 
David 
#
# cat nombres.txt |sort -d |uniq -c 
1 Alberto 
2 David 
1 Javi 
1 Silvia 
#

Contador de líneas, palabras y caracteres con el comando wc de Linux

Para esta función, utilizaremos el comando «wc».

# wc -l nombres.txt
 4 nombres.txt
#

Con «wc -w» cuenta el número de palabras de un fichero de texto.

Para contar el número de ficheros que hay en un directorio, haremos:

[root@prt53ws1 ~]# ls -la |wc -l
16
[root@prt53ws1 ~]#

Cortar caracteres de una cadena de texto con el comando cut de Linux

A veces nos interesan obtener sólo algunos de los valores que devuelve un comando, bien para mejorar la vista solamente con los campos que nos interesan o porque estemos utilizando dichos valores en algún script. El comando «cut» es idóneo para esta función.

# cat campos.txt 
campo1:campo2:campo3:campo4 
c1v1 :c1v2 :c1v3 :c1v4 
c2v1 :c2v2 :c2v3 :c2v4 
#
# cut -d ':' -f 2,4 campos.txt 
campo2:campo4 
c1v2 :c1v4 
c2v2 :c2v4 
#

Para hacer esto, personalmente uso más el comando «awk». Se haría de la siguiente manera: awk -f «:» ‘{print $2″ «$4}’, pero son manías mías 😉

Ahora tenemos otro fichero con el abecedario y queremos ver las letras de la 4 a la 14:

[usuario1@noname00 ~]$ cut -c 4-14 abecedario.txt defghijklmn 
[usuario1@noname00 ~]$

Sustituir una cadena de texto por otra con el comando sed en Linux

El comando «sed» se encarga de buscar un texto dentro de un fichero o en la salida de un comando y sustituirlo por otro.

sed ‘s/cadena_original/cadena_nueva/’ NombreFichero

Ejemplo:

# sed 's/Silvia/Laura/' nombres.txt 
David 
Laura 
Javi 
Alberto 
David 
#

También podemos aplicar los cambios dentro de un fichero:

sed -ie ‘s/cadena_original/cadena_nueva/’ NombreFichero

sed -ie 's/\/var\/log\/messages/#\/var\/log\/messages/' fichero.cfg

Ver las primeras líneas de un texto en Linux con el comando head

Utilizaremos el comando «head».

ls -la |head -6
[root@prt53ws1 ~]# ls -la |head -6
total 220
dr-xr-x---.  8 root root   4096 Jan 26 06:47 .
dr-xr-xr-x. 22 root root   4096 Oct 15 10:47 ..
drwxr-xr-x   5 root root     66 Sep 11 17:18 amzn-drivers
drwxr-xr-x   2 root root     39 Oct  2 21:31 .aws
-rw-------.  1 root root  18987 Jan 25 21:32 .bash_history
[root@prt53ws1 ~]#

El comando «tail», hacelo mismo pero muestra las últimas líneas.

Comparar el contenido de dos ficheros de texto en Linux con diff

Esto lo utilizo mucho para saber si han habido diferencias del mismo fichero en diferentes fechas o el mismo fichero de diferentes servidores.

# cat nombres.txt
David
Silvia
Javi
Alberto
Marcos
#
# cat nombres2.txt
David
Silvia
Javi
Alberto
Pepe
diff nombres.txt nombres2.txt
5c5
< Marcos

> Pepe
#

Ha detectado que la línea número 5 es diferente.

No olvides visitar la guía de Linux.

Te puede interesar

COMPÁRTEME

Deja un comentario