En algunos de los comandos que he ejecutado en capítulos anteriores he utilizado tuberías con comandos como grep o sort 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
Mi pasión por la tecnología me lleva constantemente a explorar las últimas tendencias y aplicaciones, buscando siempre formas de implementar soluciones innovadoras que mejoren la eficiencia. En puerto53.com comparto contenido valioso para ayudar a otros profesionales y entusiastas de la informática a navegar y dominar el complejo mundo de la tecnología. Mi especialidad en Linux RedHat.
Más sobre mí en el este enlace,