Los administradores de sistemas usan una cantidad incalculable de herramientas de línea de comandos, y es probable que usted use regularmente las tres que se analizan en este artículo:grep
, sed
y awk
. Pero, ¿conoces todas las formas en que puedes usarlos para manipular texto? Si no (o no está seguro), continúe leyendo.
Antes de comenzar, estos son los orígenes de los nombres de los comandos:
grep
:Según Wikipedia, el nombre "viene deled
comando g/re/p (g búsqueda local de una r e regular expresión x y p imprimir líneas coincidentes), que tiene el mismo efecto."ed
es un "editor de texto orientado a líneas". Incluso para alguien a quien le gusta la línea de comandos, editar archivos línea por línea parece demasiado anticuado, pero la gente tenía que empezar con algo en la antigüedad. ).sed
:El nombre proviene de su uso principal, como s tren ed itor.awk
:Su nombre proviene de las iniciales de sus autores (Aho, Weinberger y Kernighan). Si el nombre Kernighan te suena (juego de palabras) es porque este científico informático canadiense contribuyó a la creación de Unix y es coautor del primer libro sobre el lenguaje C.
Es excelente rastrear el árbol genealógico de los comandos, pero lo que realmente importa es que estos comandos son muy útiles para la manipulación de texto.
En los siguientes ejemplos, usaré un archivo llamado quotes.txt
para ilustrar cómo usar los comandos. Aquí está el contenido de este archivo:
$ cat quotes.txt
"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55
"Not only does God play dice but... he sometimes throws them where they cannot be seen."
- Stephen Hawking
"I regard consciousness as fundamental..."
- Max Planck
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan
"[T]he atoms or elementary particles themselves are not real; they form a world of potentialities or possibilities rather than one of things or facts."
- Werner Heisenberg
grep
La forma más sencilla de usar grep
es:
$ grep universe quotes.txt
"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
Este ejemplo proporciona la cadena para buscar (universo) y el lugar para buscarla (quotes.txt).
Si hay espacios en la cadena que desea buscar, debe poner comillas alrededor:
$ grep "the universe" quotes.txt
"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
Algunas variaciones comunes al usar grep
son:
- Ignorar mayúsculas y minúsculas:
grep -i string-to-search filename
- Buscar en varios archivos:
grep -i string-to-search *.txt
Puede buscar una expresión regular:
$ grep "191[0-9]" quotes.txt
- Albert Einstein, The Born-Einstein Letters 1916-55
Si desea habilitar patrones de expresiones regulares extendidas para usar símbolos como +
, ?
, o |
, puede usar el egrep
comando, que es un atajo para agregar el -E
marcar a grep
. Esto también le permite buscar varias cadenas:
$ egrep -i "albe|hawk" quotes.txt
- Albert Einstein, The Born-Einstein Letters 1916-55
- Stephen Hawking
Para mostrar líneas que incluyen la palabra "universo" más la siguiente línea (para incluir el nombre del autor):
$ grep -i universe -A 1 quotes.txt
"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55
--
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan
Como probablemente pueda adivinar, podría mostrar más líneas pasando un número diferente. O podría mostrar las líneas antes usando la bandera -B
.
Hasta ahora, he mostrado grep
corriendo solo, pero es muy común tenerlo en una cadena de comandos:
$ echo "Authors who mentioned 'universe'"; cat quotes.txt | grep -i universe -A 1 | grep "^-"
- Albert Einstein, The Born-Einstein Letters 1916-55
- Carl Sagan
[ También podría estar interesado en leer 11 comandos de Linux sin los que no puedo vivir. ]
sed
Mi uso favorito para sed
es reemplazar cadenas en archivos. Por ejemplo:
$ cat quotes.txt | sed 's/universe/Universe/g'
Esto reemplazará a universe
con Universe
y envía el resultado a stdout . El g
flag significa "reemplazar todas las apariciones de la cadena en cada línea".
Algunas variaciones para esto son:
- Reemplace la cadena solo si se encuentra en las tres primeras líneas:
sed '1,3 s/universe/Universe/g' quotes.txt
- Reemplace el n -ésima aparición de un patrón en una línea (por ejemplo, la segunda aparición):
sed 's/universe/Universe/2' quotes.txt
Estos ejemplos no cambian el archivo original. Si quieres sed
para cambiar el archivo en su lugar, use -i
:
$ sed -i 's/universe/Universe/g' quotes.txt
Si usa el -i
marca, asegúrese de saber exactamente qué y cuántas ocurrencias se verá afectado, ya que modificará el archivo original. Para averiguarlo, puede ejecutar un grep
y busque el patrón primero.
[ ¿Quiere poner a prueba sus habilidades de administrador de sistemas? Tome una evaluación de habilidades hoy. ]
wow
El awk
La utilidad es muy poderosa y ofrece muchas opciones para procesar archivos de texto.
La mayoría de las situaciones en las que uso awk
involucran el procesamiento de archivos con una estructura (columnas) que es razonablemente predecible, incluido el carácter utilizado como separador de columnas.
Cuando awk
procesa un archivo, divide cada línea usando el "separador de campo" (variable interna FS
, que por defecto es el carácter de espacio). Cada campo se asigna a variables posicionales ($1
contiene el primer campo, $2
contiene el segundo, y así sucesivamente. $0
representa la línea completa).
También puede aplicar filtros a cada línea. Por ejemplo:
$ cat quotes.txt | awk '/universe/ { print NR " - " $0 }'
1 - "God does not play dice with the universe."
10 - "The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
Los comandos pasados a awk
use comillas simples (es como pasar un mini-programa para que lo interprete):
- El
/universe/
parte le dice aawk
para seleccionar solo las líneas que coincidan con este patrón. - El programa "principal" va entre corchetes.
NR
es la variable interna que contiene el número del registro actual, por ejemplo, el número de línea actual.- Agregué el
" -"
cadena para la estética.
Las variables internas en awk
son:
NR
:El número total de registros de entrada vistos hasta ahora por el comandoNF
:El número de campos en el registro de entrada actualFS
:El separador de campo de entrada (un espacio por defecto)
Aquí hay un ejemplo usando un formato de archivo más "predecible":
$ cat /etc/passwd | awk '/nologin/ { FS=":"; print $1 }'
(output omitted)
...
redis
akmods
cjdns
haproxy
systemd-oom
En este último ejemplo:
/nologin/
selecciona solo las líneas que contienen este patrón.FS=": ";
establece el separador de campo en:
en lugar del predeterminado (espacio).print $1
imprime el primer campo de cada línea (considerando que el separador es:
).
Más información
Esos fueron algunos ejemplos simples para usar grep
, sed
y awk
.
Si lees el man
páginas para cada uno, notará muchos parámetros y usos adicionales para estos útiles comandos.
Para casos de uso simples y cosas que hace solo de vez en cuando, siempre es bueno tener herramientas como estas en su caja de herramientas.
Si la acción requerida es más compleja, vale la pena considerar si estas herramientas aún tienen sentido para su uso. Para un caso de uso corporativo o para administrar "todo como código", recomiendo usar Ansible. Los módulos de Ansible tienen características similares que le permiten emular las operaciones descritas anteriormente, con la ventaja de que los módulos de Ansible generalmente tienen idempotencia y que el proceso completo se documentará en algún lugar (como en su repositorio interno de Git).