Lista de comandos en Bash sobre GNU/Linux

Jorge nos dice en un comentario:

hola nache, como ya sabemos todos que juande nos va ha dejar un folio con los commandos que creamos que vayamos a necesitar, podrias dejarnos un pequeño resumen de lo que nos hará falta a la hora del examen, mas que ná es por que seguramente el que hagamos nosotros estará incompleto […].

Bien, de lo que más hay que acordarse es de la sintáxis, es decir, de como se escribe el programa. Al fin y al cabo, con un «ls /bin/» o con un «ls /usr/bin/» podemos ver la mayoría de los comandos disponibles. Además, si todo va bien y Juande no nos quita los «man pages»  (dijo que estarían accesibles) disponemos de una gran ayuda a la hora de hacer el script. Por ejemplo, con «man sh» podemos ver un extenso manual de uso de la shell, lo cual nos indica la sintáxis que debemos usar en los scripts. Estaría bien echarle un vistazo en casa para saber donde se encuentran las cosas y saber interpretar la sintáxis que nos plantea esa página de manual. Podemos encontrar la sintáxis de while, de if, de case, etc etc…

Aun así, debemos recordar que seguramente en nuestros scripts nos pedirá cosas como:

-buscar un fichero

-buscar un contenido dentro de un fichero y mostrar una parte

-contar lineas de un fichero o extraer una linea concreta

-bucles (for o while)

-los case

-manejar información obtenida de un comando (ver quién está conectado con who) y separarla con «cut» y «tr»

-pedir que introduzcamos por teclado  una información (parametros) para tratarla desde dentro del script

-pasar información a un script desde la linea de comandos

Vamos a realizar una lista, vamos a completar la que ya publiqué en esta entrada: https://sti.nache.net/2009/12/04/manejo-basico-de-la-terminal-en-gnulinux/

Extraer la linea 10 de un archivo:

head -10 /etc/passwd | tail -1

Extraer la linea 10 y el primer dato de una serie de datos separados por dos puntos

head -10 /etc/passwd | tail -1 | cut -d»:» -f1

Compactar espacios en uno solo:

tr -s «» » »

Reemplazar un caracter por otro:

tr «a» «b»

Obtener el segundo dato de una serie de dato separados por dos puntos:

echo «dato1:dato2:dato3:dato4″ | cut -d»:» -f2

Obtener quién está conectado en la máquina (el nombre de usuario):

who | tr -s»» » » | cut -d» » -f1

Obtener la fecha de conexión de los usuaros conectados:

who | tr -s»» » »  | cut -d» » -f3

Obtener la hora de conexión de los usuarios conectados:

who | tr -s»» » »  | cut -d» » -f4

Obtener usuario, fecha y hora a la vez:

who | tr -s»» » »  | cut -d» » -f1,3,4

Con tr y esa sintáxis obligamos al comando who a compactar todos los espacios en uno solo, para luego decirle a cut que usando un espacio como delimitador de datos, obtenga la fila o filas dadas (-f1 o -f1,3,4)


Obtener los usuarios que empiecen por aj dentro del archivo passwd:

grep ^aj /etc/passwd

Hacer lo anterior y obtener la linea 10:

grep ^aj /etc/passwd | head -10 | tail -1

Usando el sombrerito ^ indicamos que lo que buscamos se encuentra justo al principio de la linea y no en otro lugar


Buscar un fichero:

find /proc -name «cpuinfo» 2>/dev/null

Usando 2>/dev/null  le decimos que toda la basura que no nos interesa la mande a otro lugar y no nos la muestre


Pasando información por parametros:

./script parametro1 parametro2 parametro3

los parametros, dentro del script serán las variables $1 $2 y $3


Pasar información leyendo entrada de teclado:

read nombrevariable

El texto introducido estará en la variable $nombrevariable


Comprobando si dos ficheros son iguales:

cmp fichero1 ficharo2

Enlaces duros:

ln /etc/passwd $HOME/passwd

Enlaces blandos:

ln -s /etc/passwd $HOME/passwd2

Listar el arbol de directorios y ficheros de un lugar dado:

tree /etc/

Buscar archivos:

find -name «nombrearchivo» /lugar/donde/buscamos/

find -name «passwd» /etc/

find -name «pass*» /etc/

Almacenar la salida de un comando en una variable:

variable=`cat /etc/passwd`

Se usan las comillas que hay al lado de la «P», la misma tecla que tiene un ^ y un [


Incrementar el valor de una variable dentro de un bucle:

i=`expr $i + 1`

#!/bin/bash
i=0

while (( $i != 10 )); do

     i=`expr $i + 1`
     echo $i

done

Tened especial cuidado con la sintáxis, comprobad que cerrais todas las comillas que habeis abierto, comprobad que todos los if, los while, los for y los case los cerrais correctamente if (fi) while (done) for (done) case (esac) etc etc…  Si os dá un error de sintáxis comprobad eso y que no os falte un espacio en la linea que os indica o la anterior. Comprobad y tened especial cuidado con las variables, cuando le asignamos un valor NO SE PONE DOLAR.

Recordad que cuando un comando nos muestra varias lineas podemos ir manejando cada una de ellas con el bucle for:

#!/bin/bash

for i in `ls /etc/`; do
  echo $i
done

Recordad que si hacemos lo anterior y las lineas mostradas tienen espacios, debemos camuflarlas con un caracter concreto y luego quitarselo con tr:

#!/bin/bash
for i in `cat /etc/passwd | tr " " "¿" `; do
 echo $i | tr "¿" " "

done

Recordad que cuando ejecutamos un comando, para comprobar si ha ido bien se usa $? (cero bien, uno mal). Cuando no esteis seguros de el valor que os tiene que dar, simplemente os vais a la terminal, ejecutais el comando y a continuación escribís «echo $?» y sabreis el valor que os da ese comando. Por ejemplo:

[[email protected] ~]$ cmp /etc/passwd /etc/passwd

[[email protected] ~]$ echo $?
0
[[email protected] ~]$

Nos devuelve 0, por lo tanto el valor cero significa que los archivos son iguales.

Y por último, recordad el PATH en donde está el script y el PATH donde quereis meter o sacar datos. Si el script está en /home/pepito/script.sh y dentro del script haceis «ls datos/» en realidad estáis haciendo «ls /home/pepito/datos/«. Por el contrario, si haceis «ls /datos/» estais buscando el directorio datos al principio del árbol de directorios (observad la barra invertida).

Como ya he dicho antes, tenéis mas comandos en: https://sti.nache.net/2009/12/04/manejo-basico-de-la-terminal-en-gnulinux/

Y con esto, se finí. Si me acuerdo de algún comando más, lo pondré. Si alguno de vosotros recuerda algún otro comando basta que lo comparta en los comentarios.

Un saludo, see you tomorrow x)