Ghost AcademyGhostLinux · Ghost Academy
GhostLinuxMódulo 103Examen 101-500

Comandos GNU y Unix

LPI 103.1 Línea de comandosLPI 103.2 Filtros de textoLPI 103.3 Gestión de ficherosLPI 103.4 Streams, pipes y redireccionesLPI 103.5 ProcesosLPI 103.6 PrioridadesLPI 103.7 Expresiones regularesLPI 103.8 Editor vi

Este es, con diferencia, el tema con más peso de todo el examen 101-500 — y el que más vas a usar el resto de tu vida con Linux delante. No hay atajos: hay que escribir estos comandos cientos de veces hasta que salgan sin pensar. Este capítulo es largo a propósito; vuelve a él tantas veces como haga falta.

Objetivos de la unidad

1. LPI 103.1 — Trabajar en la línea de comandos

1.1 Variables de entorno y de shell

root@lpic1:~#
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
root@lpic1:~#
$ export EDITOR=vim
root@lpic1:~#
$ env | grep -i lang
LANG=es_ES.UTF-8
ComandoQué hace
export VAR=valorCrea/modifica una variable y la hace visible a los procesos hijos
unset VARElimina una variable
envLista todas las variables de entorno exportadas
setLista variables de entorno y variables locales del shell actual
$PATHLista de directorios donde el shell busca ejecutables, separados por :
$HOME, $USER, $SHELL, $PWDVariables estándar que todo shell de login define

1.2 Historial y edición de la línea de comandos

Atajo/comandoQué hace
historyLista los comandos ejecutados recientemente, numerados
!55Vuelve a ejecutar el comando número 55 del historial
!!Repite el último comando (típico para anteponer sudo: sudo !!)
Ctrl+RBúsqueda incremental hacia atrás en el historial
Ctrl+A / Ctrl+EIr al principio / al final de la línea
TabAutocompletado de comandos, rutas y, con muchos programas, de argumentos

1.3 Ayuda y localización de comandos

root@lpic1:~#
$ man ls
LS(1)                     User Commands                    LS(1)
NAME
       ls - list directory contents
SYNOPSIS
       ls [OPTION]... [FILE]...
...
root@lpic1:~#
$ which python3
/usr/bin/python3
root@lpic1:~#
$ type cd
cd is a shell builtin
root@lpic1:~#
$ whereis grep
grep: /usr/bin/grep /usr/share/man/man1/grep.1.gz
ComandoPara qué
man comandoManual completo de un comando
man -k palabra (= apropos)Busca comandos relacionados con una palabra clave
info comandoDocumentación en formato GNU Info, a veces más detallada que el man
comando --helpResumen rápido de opciones, sin salir al paginador
which comandoRuta del ejecutable que se lanzaría, según $PATH
type comandoIndica si es un binario, un alias, una función o un builtin del shell — más completo que which
whereis comandoLocaliza binario, fuente y páginas de manual de un comando

1.4 Alias

root@lpic1:~#
$ alias ll='ls -lah'
root@lpic1:~#
$ alias
alias ll='ls -lah'
alias grep='grep --color=auto'
root@lpic1:~#
$ unalias ll
Un alias creado así solo dura la sesión actual. Para que sea permanente, añádelo a ~/.bashrc (solo para tu usuario) y recarga con source ~/.bashrc.
🧰 Recursos relacionados (Ghost Academy)

Practica más — labs ya publicados en Ghost Academy sobre este tema: 🔧 Comandos varios I (lab)

2. LPI 103.2 — Procesar flujos de texto con filtros

Un "filtro" en Unix es un programa que lee de la entrada estándar, transforma algo, y escribe en la salida estándar — pensado para encadenarse con tuberías (sección 4). Esta es la caja de herramientas de texto más usada de todo Linux.

ComandoQué hace
catConcatena y muestra ficheros completos
tacComo cat, pero con las líneas en orden inverso
head -n N / tail -n NPrimeras/últimas N líneas
tail -f ficheroSigue el fichero en tiempo real — imprescindible para logs
sortOrdena líneas (-n numérico, -r inverso, -k por columna, -u elimina duplicados al ordenar)
uniqElimina líneas duplicadas consecutivas — por eso casi siempre va detrás de sort
wcCuenta líneas (-l), palabras (-w) y bytes/caracteres (-c/-m)
cutExtrae columnas por posición (-c) o por delimitador (-d ':' -f 1)
pasteUne líneas de varios ficheros en columnas, lado a lado
joinUne dos ficheros ordenados por un campo común, como un JOIN de SQL
trTraduce o elimina caracteres carácter a carácter (no trabaja por líneas)
expand / unexpandConvierte tabuladores en espacios y viceversa
fmtReajusta el ancho de línea de un texto para que quede legible
prPagina texto para impresión, con cabeceras y numeración de página
nlNumera las líneas de un fichero
od -cVuelca un fichero en octal/hexadecimal — útil para ver caracteres no imprimibles
splitTrocea un fichero grande en partes más pequeñas
sedEditor de flujo: sustituciones y transformaciones línea a línea sin abrir un editor interactivo
awkLenguaje de procesamiento de texto por campos y registros — el más potente de todos
root@lpic1:~#
$ sort /etc/passwd | cut -d: -f1 | head -5
backup
bin
daemon
games
gnats
root@lpic1:~#
$ cat accesos.log | cut -d' ' -f1 | sort | uniq -c | sort -rn | head -3
  142 203.0.113.9
   87 198.51.100.4
   51 192.0.2.17
Esa combinación — cut para extraer la IP, sort para agrupar, uniq -c para contar repeticiones y sort -rn para ordenar de más a menos — es prácticamente el "hola mundo" del análisis de logs en una terminal. Apréndetela de memoria.
root@lpic1:~#
$ echo 'hola mundo' | tr 'a-z' 'A-Z'
HOLA MUNDO
root@lpic1:~#
$ sed 's/error/ERROR/g' app.log | head -3
2026-09-30 10:02:11 ERROR: conexión rechazada
2026-09-30 10:02:14 ERROR: timeout tras 30s
2026-09-30 10:03:01 INFO: reintentando
root@lpic1:~#
$ awk -F: '{print $1, $3}' /etc/passwd | head -3
root 0
daemon 1
bin 2
awk -F: '{print $1, $3}' — el -F: fija : como separador de campos, y $1/$3 son el primer y tercer campo de cada línea (usuario y UID en /etc/passwd). El examen pregunta por esta sintaxis de campos ($1, $2... y $0 para la línea completa) con bastante frecuencia.
🧰 Recursos relacionados (Ghost Academy)

Practica más — labs ya publicados en Ghost Academy sobre este tema: 📝 Redirección y texto I (lab) · 📝 Redirección y texto II (lab) · 📝 Redirección y texto III (lab)

Valida lo aprendido — tests temáticos de Recursos: 📝 Test: Procesamiento de Texto

3. LPI 103.3 — Gestión básica de ficheros

ComandoQué hace
cp origen destinoCopia un fichero (-r para directorios, -p conserva permisos/fechas, -a copia "como es", el modo habitual para backups)
mv origen destinoMueve o renombra
rm ficheroBorra (-r recursivo, -f sin preguntar — combinación peligrosa, piensa dos veces antes de rm -rf)
mkdir -p ruta/anidadaCrea directorios, incluidos los padres que no existan
rmdirBorra un directorio, solo si está vacío
touch ficheroCrea un fichero vacío, o actualiza su fecha de modificación si ya existe
find ruta -name patrónBusca ficheros recursivamente por nombre, tipo, tamaño, fecha...
locate patrónBusca por nombre en una base de datos indexada (más rápido que find, pero puede estar desactualizada hasta el siguiente updatedb)
file ficheroIdentifica el tipo real de un fichero por su contenido, no por su extensión
ln origen enlaceEnlace duro (mismo inodo)
ln -s origen enlaceEnlace simbólico (un puntero a una ruta) — se detalla en el módulo 104
tarEmpaqueta (y opcionalmente comprime) ficheros y directorios
gzip/gunzip, bzip2, xzCompresores que tar suele invocar automáticamente con sus propias opciones
root@lpic1:~#
$ find /var/log -name '*.log' -mtime -7
/var/log/apt/term.log
/var/log/auth.log
/var/log/syslog
root@lpic1:~#
$ find / -size +100M -type f 2>/dev/null
/var/lib/docker/overlay2/.../layer.tar
root@lpic1:~#
$ file /usr/bin/bash
/usr/bin/bash: ELF 64-bit LSB pie executable, x86-64, dynamically linked
root@lpic1:~#
$ tar -czvf backup.tar.gz /etc/apache2/
tar: Removing leading `/' from member names
etc/apache2/
etc/apache2/apache2.conf
etc/apache2/sites-available/
etc/apache2/sites-available/000-default.conf
root@lpic1:~#
$ tar -xzvf backup.tar.gz -C /tmp/restaurado/
Flag de tarSignificado
-cCrear un archivo nuevo
-xExtraer
-tListar contenido sin extraer
-zComprimir/descomprimir con gzip (.tar.gz/.tgz)
-jCon bzip2 (.tar.bz2)
-JCon xz (.tar.xz)
-vModo detallado (verbose), muestra cada fichero procesado
-f ficheroIndica el nombre del archivo — casi siempre es la última opción antes del nombre
🧰 Recursos relacionados (Ghost Academy)

Practica más — labs ya publicados en Ghost Academy sobre este tema: 📁 Navegación de archivos (lab) · 📦 Archivos & Compresión I (lab) · 📦 Archivos & Compresión II (lab) · 🌳 Compartir estructuras con tree (lab)

Valida lo aprendido — tests temáticos de Recursos: 📁 Test: Archivos & Navegación

4. LPI 103.4 — Streams, tuberías y redirecciones

Todo proceso en Linux nace con tres flujos abiertos: entrada estándar (stdin, descriptor 0), salida estándar (stdout, descriptor 1) y salida de error (stderr, descriptor 2). Redirigir es simplemente decirle al shell que conecte esos flujos a un fichero o a otro proceso en vez de a la terminal.

OperadorQué hace
>Redirige stdout a un fichero, sobrescribiéndolo
>>Redirige stdout añadiendo al final del fichero
<Usa un fichero como entrada estándar de un comando
2>Redirige solo stderr a un fichero
2>&1Redirige stderr al mismo sitio donde va stdout en ese momento
>fichero 2>&1Combina ambos flujos en el mismo fichero (el orden importa)
&>ficheroAtajo de bash para lo anterior
|Tubería: conecta la stdout de un comando con la stdin del siguiente
tee ficheroDivide un flujo: lo escribe en un fichero y lo deja pasar a la salida estándar
xargsConvierte la entrada estándar en argumentos de otro comando — imprescindible cuando un comando no acepta entrada por stdin directamente
root@lpic1:~#
$ ls /no/existe > salida.txt 2> error.txt
root@lpic1:~#
$ cat error.txt
ls: cannot access '/no/existe': No such file or directory
root@lpic1:~#
$ find / -name '*.conf' 2>/dev/null | wc -l
214
2>/dev/null es el patrón más repetido del examen y de la vida real: descarta los errores (típicamente "permiso denegado" al recorrer todo el disco con find) sin perder la salida que sí te interesa.
root@lpic1:~#
$ dmesg | tee dmesg_copia.txt | grep -i error
[   12.441023] usb 1-1: error -71
root@lpic1:~#
$ find . -name '*.tmp' | xargs rm -v
removed './cache/a.tmp'
removed './cache/b.tmp'
Ojo con el orden en comando > fichero 2>&1: primero stdout apunta a fichero, y luego stderr se redirige a donde apunta stdout en ese instante — es decir, también a fichero. Si lo escribes al revés (2>&1 > fichero), stderr se queda apuntando a la terminal porque en ese momento stdout todavía no se había movido.

5. LPI 103.5 — Crear, vigilar y matar procesos

ComandoQué hace
psFoto fija de los procesos en ejecución (ps aux o ps -ef, las dos formas clásicas, una de estilo BSD y otra de estilo Unix)
top / htopVista en vivo, actualizada, ordenable por CPU o memoria
pgrep patrónBusca PIDs por nombre de proceso
pkill patrónEnvía una señal a todos los procesos que coincidan con el patrón
kill -SEÑAL PIDEnvía una señal a un PID concreto
killall nombreComo kill, pero por nombre de proceso en vez de PID
comando &Lanza el comando en segundo plano
jobsLista los trabajos en segundo/primer plano de la sesión actual
fg %1 / bg %1Trae un trabajo a primer plano / lo reanuda en segundo plano
Ctrl+ZSuspende el proceso en primer plano (queda parado, no en segundo plano hasta que haces bg)
nohup comando &Lanza un proceso que sobrevive aunque cierres la sesión/terminal
free -hMemoria RAM y swap, en formato legible
uptimeTiempo encendido y carga media del sistema (load average)
root@lpic1:~#
$ ps aux | grep sshd
root   612  0.0  0.3  14256  6120 ?  Ss  10:01  0:00 /usr/sbin/sshd -D
root@lpic1:~#
$ kill -15 612
root@lpic1:~#
$ kill -9 612
SeñalNúmeroEfecto
SIGHUP1Recarga de configuración en muchos daemons (histórico: "se colgó la línea")
SIGINT2Lo que envía Ctrl+C — interrumpir
SIGKILL9Mata el proceso de inmediato, sin posibilidad de limpieza — no se puede ignorar ni capturar
SIGTERM15Pide al proceso que termine de forma ordenada — la señal por defecto de kill y la que siempre hay que probar primero
SIGSTOP19Pausa el proceso — tampoco se puede ignorar
SIGCONT18Reanuda un proceso parado
Por qué casi nunca empiezas con kill -9: SIGKILL no le da al proceso ninguna oportunidad de cerrar ficheros, liberar locks o guardar estado — puede dejar datos a medio escribir. El orden correcto es: kill (envía SIGTERM por defecto) y solo si el proceso no responde en unos segundos, kill -9 como último recurso.
root@lpic1:~#
$ sleep 300 &
[1] 4821
root@lpic1:~#
$ jobs
[1]+  Running    sleep 300 &
root@lpic1:~#
$ fg %1
sleep 300
^Z
[1]+  Stopped    sleep 300
root@lpic1:~#
$ bg %1
[1]+ sleep 300 &
🧰 Recursos relacionados (Ghost Academy)

Practica más — labs ya publicados en Ghost Academy sobre este tema: ⚙️ Procesos & sistema (lab) · 🔄 Admin de procesos y servicios (lab)

Valida lo aprendido — tests temáticos de Recursos: 🔄 Test: Procesos & Gestión

6. LPI 103.6 — Modificar la prioridad de ejecución

El planificador del kernel reparte CPU entre procesos según su prioridad. En espacio de usuario se controla con el valor nice, que va de -20 (máxima prioridad, el proceso es "menos amable" con los demás) a +19 (mínima prioridad, el proceso cede CPU a todos los demás).

ComandoQué hace
nice -n 10 comandoLanza un comando nuevo con nice +10 (menor prioridad de la normal)
renice -n -5 -p PIDCambia el nice de un proceso ya en marcha
ps -lMuestra, entre otras columnas, NI (nice) y PRI (prioridad real que usa el kernel)
top, tecla rCambia el nice de un proceso de forma interactiva, sin salir de top
root@lpic1:~#
$ nice -n 15 tar -czf backup.tar.gz /home/
root@lpic1:~#
$ renice -n -5 -p 4821
4821 (process ID) old priority 0, new priority -5
Solo root puede asignar valores negativos de nice (subir la prioridad) o bajarle la prioridad a un proceso de otro usuario. Un usuario normal solo puede subir el valor nice de sus propios procesos (bajarles prioridad a sí mismo), nunca bajarlo.

7. LPI 103.7 — Buscar texto con expresiones regulares

Una expresión regular (regex) describe un patrón de texto, no un texto literal. grep es la herramienta de referencia para buscarlas en ficheros, pero el mismo lenguaje de patrones lo reutilizan sed, awk, vim y prácticamente cualquier lenguaje de programación.

MetacarácterSignificado
.Cualquier carácter individual
*Cero o más repeticiones del carácter/grupo anterior
^Principio de línea
$Final de línea
[abc]Cualquiera de los caracteres indicados
[^abc]Cualquier carácter excepto los indicados
[0-9], [a-z]Rangos de caracteres
\Escapa el carácter siguiente (para buscarlo literal, p.ej. \. para un punto literal)

Estos metacaracteres son regex básica (BRE), la que entiende grep por defecto. La regex extendida (ERE) añade más potencia y la activas con grep -E (o el comando histórico egrep):

Metacarácter (solo ERE)Significado
+Una o más repeticiones
?Cero o una repetición (opcional)
{n,m}Entre n y m repeticiones
(abc\|xyz) en BRE, (abc|xyz) en EREAlternativa: "abc" o "xyz"
root@lpic1:~#
$ grep -E '^[0-9]{3}-[0-9]{4}$' telefonos.txt
555-1234
911-0000
root@lpic1:~#
$ grep -v '^#' /etc/ssh/sshd_config | grep -v '^$'
Port 22
PermitRootLogin no
PasswordAuthentication no
root@lpic1:~#
$ grep -ril 'TODO' /var/www/
/var/www/html/index.php
/var/www/html/config.php
Opción de grepEfecto
-iIgnora mayúsculas/minúsculas
-vInvierte: muestra las líneas que no coinciden
-r / -RBusca recursivamente en subdirectorios
-lMuestra solo el nombre de los ficheros con coincidencias, no las líneas
-nMuestra el número de línea de cada coincidencia
-cCuenta coincidencias en vez de mostrarlas
-EActiva regex extendida (ERE)
-F (= fgrep)Trata el patrón como texto literal, sin metacaracteres — más rápido si no necesitas regex
Diferencia clásica de examen: BRE (grep normal) necesita escapar \+, \?, \| y \{n,m\} para que funcionen como especiales; en ERE (grep -E) esos mismos caracteres ya son especiales sin escapar, y tendrías que escaparlos si los quisieras literales.

8. LPI 103.8 — Edición básica de ficheros con vi

vi (o su versión mejorada, vim) está presente en absolutamente todas las instalaciones mínimas de Linux/Unix — por eso el examen lo exige aunque tú uses nano en el día a día. Tres modos, nunca te pierdas entre ellos:

ModoPara quéCómo se entra
Normal (comando)Moverte, borrar, copiar, pegar — el modo por defecto al abrirEsc desde cualquier otro modo
InserciónEscribir texto literalmentei (antes del cursor), a (después), o (línea nueva debajo)
Línea de comandos (ex)Guardar, salir, buscar/reemplazar, ejecutar comandos de edición: desde modo normal
root@lpic1:~#
$ vi /etc/hosts
# abre el fichero en modo normal
Comando (modo normal)Efecto
h j k lIzquierda / abajo / arriba / derecha (las flechas también funcionan)
ddBorra (y copia) la línea completa
yyCopia ("yank") la línea sin borrarla
pPega después de la línea/posición actual
uDeshacer
Ctrl+RRehacer
xBorra el carácter bajo el cursor
/patrón + EnterBusca hacia adelante; n repite la búsqueda, N en sentido contrario
G / ggIr al final / al principio del fichero
:5Ir directamente a la línea 5
Comando (modo ex, tras :)Efecto
:wGuarda
:qSale (falla si hay cambios sin guardar)
:q!Sale descartando cambios sin guardar
:wq (= ZZ en modo normal)Guarda y sale
:%s/viejo/nuevo/gSustituye "viejo" por "nuevo" en todo el fichero (% = todas las líneas, g = todas las coincidencias por línea)
:set nuMuestra números de línea
El fallo más común del alumno que nunca ha tocado vi: escribir texto a pelo sin haber pulsado i antes, y que cada letra ejecute un comando distinto. Si eso pasa y el fichero queda hecho un desastre: Esc para volver a modo normal, y :q! para salir sin guardar nada — vuelves a empezar limpio.
root@lpic1:~#
$ :%s/127.0.0.1/192.168.1.10/g
# sustituye todas las apariciones en el fichero abierto

Práctica guiada

  1. Encadena ps aux, grep, awk y sort para listar los 5 procesos que más memoria consumen ahora mismo en tu VM.
  2. Crea un fichero de prueba con nl /etc/services | head -20 > /tmp/prueba.txt, ábrelo con vi, borra tres líneas con dd tres veces, guarda y sal con :wq.
  3. Lanza sleep 200 &, compruébalo con jobs, tráelo a primer plano con fg, suspéndelo con Ctrl+Z y reanúdalo en segundo plano con bg.
  4. Busca con find /etc -name '*.conf' 2>/dev/null y cuenta el resultado con wc -l.
  5. Escribe una expresión regular extendida que capture direcciones IPv4 en un fichero de log cualquiera (grep -E).
  6. Empaqueta tu propio /etc con tar -czvf etc_backup.tar.gz /etc 2>/dev/null y verifica el contenido con tar -tzvf etc_backup.tar.gz | head, sin extraerlo.

Resumen de comandos del módulo

BloqueComandos clave
103.1 Línea de comandosenv, export, history, man, which, type, alias
103.2 Filtros de textocut, sort, uniq, tr, sed, awk, wc
103.3 Ficheroscp, mv, rm, find, file, tar
103.4 Redirecciones>, >>, 2>&1, |, tee, xargs
103.5 Procesosps, top, kill, jobs, fg/bg, nohup
103.6 Prioridadesnice, renice
103.7 Regexgrep, grep -E
103.8 vii/Esc, dd/yy/p, :wq/:q!, :%s///g
🧰 Recursos relacionados (Ghost Academy)

Practica más — labs ya publicados en Ghost Academy sobre este tema: 🐧 Comandos Linux (lab) · 📋 Linux Cheatsheet

Valida lo aprendido — tests temáticos de Recursos: 🔧 Test: Varios I · 🔧 Test: Varios II

Autoevaluación

  1. ¿Qué diferencia hay entre which y type a la hora de localizar un comando?
  2. Tienes un fichero de log y quieres las 5 IPs que más veces aparecen. ¿Qué cadena de comandos encadenarías?
  3. ¿Por qué uniq casi siempre va justo después de sort en una tubería?
  4. ¿Qué hace exactamente 2>&1, y por qué el orden respecto a >fichero importa?
  5. ¿Por qué kill -9 no debería ser tu primera opción para terminar un proceso?
  6. ¿Qué usuario puede bajar el valor nice (subir la prioridad) de un proceso, y por qué un usuario normal no puede?
  7. Escribe, en regex extendida, un patrón que capture una dirección de correo simple (usuario@dominio.tld).
  8. Abres un fichero con vi y, sin querer, empiezas a escribir en modo normal, dejándolo hecho un lío. ¿Qué dos pasos te devuelven al fichero original sin guardar nada?
← 102 · Instalación y paquetesÍndice del curso104 · Dispositivos y FHS →