Comandos avanzados#

  • echo muestra el valor de una variable o repite la salida estándar

    Las variables se dividen en dos tipos, locales y de entorno (globales), Las variables de entorno global son visibles desde una sesión de shell y en cualquier proceso secundario que genera el shell. En cambio, las variables locales solo pueden estar disponibles en el shell en el que se crean.

    $ echo "Hola Mundo"   # repite salida estándar
    Hola Mundo
    
    $ a=5
    $ echo a
    a
    
    $ echo $a             # valor de una variable local
    5
    
    $ echo "a = $a"       # utiliza " para que evalue la variable
    a = 5
    
    $ echo 'a = $a'       # utiliza ' para que no evalue la variable
    a = $a
    
    $ echo $HOME           # valor de una variable global
    /home/dani
    
  • Evaluación de comandos y operaciones

    $ a=3+4
    $ echo $a              # repite salida estándar
    3+4
    
    $ echo $((a))          # doble parentesis realiza la operación
    7
    
    $ a=$(whoami)          # un parentesis toma el valor del comando
    $ echo $a
    dani
    
  • Operaciones

    $ a=10
    $ b=4
    $ echo $((a+b))
    14
    $ echo $((a*b))
    40
    $ echo $((a/b))        # solo nº enteros
    2
    $ echo $((a-b))
    6
    $ echo $((a%b))        # modulo o resto
    2
    
    # Ejemplo de modulo:
    $ a=$RANDOM
    $ echo $a
    805
    $ b=$((a%2)) #obtenemos 0 o 1
    $ echo $b
    1
    
  • Tratamiento de candenas

    $ a=www.fsf.org
    $ echo ${a:3}
    .fsf.org
    
    $ echo ${a::3}
    www
    
    $ echo ${a:1:3}
    ww.
    
    $ echo ${a:1:4}
    ww.f
    
    $ echo ${#a}
    11
    
    $ echo ${a:$((${#a}-3))}
    org
    
    $ echo ${a::$((${#a}-3))}
    www.fsf.
    
  • Redireccionamiento > , >> , > , &> , <

    $ echo 'admin      : nombre1 ' > login.dat
    $ echo 'gerente    : nombre2 ' >> login.dat
    $ echo 'supervisor : nombre3 ' >> login.dat
    $ echo 'empleado   : nombre4 ' >> login.dat
    $ echo 'empleado   : nombre5 ' >> login.dat
    
    $ cat login.dat
    admin      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    empleado   : nombre4
    empleado   : nombre5
    
    
    $ cat test.dat                    # da un error al no existir el archivo
    cat: test.dat: No such file or directory
    
    $ cat test.dat > new.dat          # crea un archivo vacío
    cat: test.dat: No such file or directory
    
    $ cat new.dat                     # comprobamos que esta vacío
    
    $ cat test.dat 2> new.dat         # 2> recoge el error
    $ cat new.dat
    cat: test.dat: No such file or directory
    
    $ tunombre=dani
    $ cat << EOF > new_file.dat
    Mi nombre es $tunombre
    hoy es $(date)
    EOF
    
    $ cat new_file.dat
    Mi nombre es dani
    hoy es mié 12 oct 2022 16:37:57 CEST
    
    #Podemos hacer lo mismo:
    $ echo "Mi nombre es $tunombre
    hoy es $(date)" >> new_file.dat
    
    • tee ambos a fichero y a pantalla

    • /dev/null descarta la salida

    • echo $? devuelve 0 si el comando que se acaba de ejecutar no ha dado problemas

    • &> combina los operadores 2> (redirigir stderr) y > (redirigir stdout) en uno solo.

    • orden1 && orden2 La orden2 solo se ejecuta si la orden1 devuelve un estado de salida 0

    • orden1 || orden2 la orden2 solo se ejecuta si la orden1 devuelve un estado de salida distinto de 0

  • head y tail head muestra las primeras lineas y tail las ultimas, por defecto muestran 10 lineas

    $ cat login.dat
    admin      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    empleado   : nombre4
    empleado   : nombre5
    
    $ head -n 3 login.dat
    admin      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    
    $ tail -n 3 login.dat
    supervisor : nombre3
    empleado   : nombre4
    empleado   : nombre5
    
  • Pipes, tuberías «|» la salida del primer comando se toma como la entrada del siguiente.

    $ cat login.dat
    admin      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    empleado   : nombre4
    empleado   : nombre5
    
    $ head -n 3 login.dat | tail -n 1
    supervisor : nombre3
    
    #El comando bc se utiliza como calculadora
    $ echo 4/5 | bc -l
    .80000000000000000000
    
  • cut corta columnas (-f) usando como delimitador (-d)

    $ cat login.dat
    admin      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    empleado   : nombre4
    empleado   : nombre5
    
    $ cut -d ' ' -f1 login.dat
    admin
    gerente
    supervisor
    empleado
    empleado
    
    
    $ cut -d ' ' -f2 login.dat
    
    
    :
    
    
    $ cut -d ':' -f2 login.dat
    nombre1
    nombre2
    nombre3
    nombre4
    nombre5
    
  • grep filtra texto de un archivo, con la opción c muestra solo el nº de lineas que coinciden, y con -v selecciona las lineas que no coinciden

    $ cat login.dat
    admin      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    empleado   : nombre4
    empleado   : nombre5
    
    $ grep empleado login.dat
    empleado   : nombre4
    empleado   : nombre5
    
    # con la opción -c muestra solo el nº de lineas
    $ grep -c empleado login.dat
    2
    
    # con la opción -n muestra el número de lineas
    $ grep -n empleado login.dat # muestra solo el nº de lineas
    4:empleado   : nombre4
    5:empleado   : nombre5
    
    
    # con la opción -v selecciona las lineas que no coinciden
    $ grep -v empleado login.dat
    admin      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    
    #AND
    $ grep  empleado login.dat | grep 5
    empleado   : nombre5
    
  • egrep es el comando gerp extendido, este comando permite el uso de expreiones regulares más complejas que grep

    $ cat login.dat
    admin      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    empleado   : nombre4
    empleado   : nombre5
    
    # OR
    $ egrep  'empleado|admin' login.dat
    admin      : nombre1
    empleado   : nombre4
    empleado   : nombre5
    
    # con la opción -i no discrimina entre Mayúsculas y Minúsculas
    $ egrep  -i EM login.dat
    empleado   : nombre4
    empleado   : nombre5
    
  • uniq quita las lineas duplicadas

    $ cat login.dat
    admin      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    empleado   : nombre4
    empleado   : nombre5
    
    $ grep emple login.dat | cut -d' ' -f1
    empleado
    empleado
    
    $ grep emple login.dat | cut -d' ' -f1 | uniq
    empleado
    
    # con la opción -c precede a las líneas con el número de ocurrencias
    $ grep emple login.dat | cut -d' ' -f1 | uniq -c
    2 empleado
    
  • sort ordena

    $ sort login.dat
    admin      : nombre1
    empleado   : nombre4
    empleado   : nombre5
    gerente    : nombre2
    supervisor : nombre3
    
    $ cat test.dat
    2 B
    3 C
    20 D
    1 A
    $ sort test.dat
    1 A
    2 B
    20 D
    3 C
    $ sort -n test.dat #--numeric-sort
    1 A
    2 B
    3 C
    20 D
    $ sort -rn test.dat #--reverse
    20 D
    3 C
    2 B
    1 A
    
  • wc te dice el nº de lineas, palabras y caracteres que tiene el archivo

    $ wc login.dat
     5 15 110 login.dat
    
    $ wc login.dat | cut -d' ' -f2
    5
    
    $ nlineas=$(wc login.dat | cut -d' ' -f2)
    $ echo $nlineas
    5
    
  • tr sustituye caracteres

    $ cat login.dat
    admin      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    empleado   : nombre4
    empleado   : nombre5
    
    $ cat login.dat | tr 'a' 'A'
    Admin      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    empleAdo   : nombre4
    empleAdo   : nombre5
    
    $ cat login.dat | tr 'admin' 'ADMIN'
    ADMIN      : NoMbre1
    gereNte    : NoMbre2
    supervIsor : NoMbre3
    eMpleADo   : NoMbre4
    eMpleADo   : NoMbre5
    
    $ cut -d' ' -f3 login.dat
    
    
    nombre3
    
    
    # con la opción -s quita los caracteres duplicados (tr -s ' ')
    
    $ cat login.dat | tr -s ' '
    admin : nombre1
    gerente : nombre2
    supervisor : nombre3
    empleado : nombre4
    empleado : nombre5
    
    $ cat login.dat | tr -s ' ' | cut -d' ' -f3
    nombre1
    nombre2
    nombre3
    nombre4
    nombre5
    
  • sed stream editor, realiza operaciones de edición de texto en archivos de texto, de manera automatizada y en línea.

    $ sed -n '2,3p' login.dat
    gerente    : nombre2
    supervisor : nombre3
    
    $ sed -n '3p' login.dat
    supervisor : nombre3
    
    $ sed 's/admin/ADMIN/g' login.dat
    ADMIN      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    empleado   : nombre4
    empleado   : nombre5
    
    #si utilizamos la opción -i el archivo original se editará en su lugar
    $ sed -i 's/admin/ADMIN/g' login.dat
    $ cat linea.dat
    ADMIN      : nombre1
    gerente    : nombre2
    supervisor : nombre3
    empleado   : nombre4
    empleado   : nombre5
    
    #eliminar lineas en blanco de un archivo
    sed '/^$/d' archivo.txt
    
    #cambiar tabulaciones por espacios
    sed -i 's/\t/ /g' archivo.txt
    
  • paste muestra por pantalla el contenido de dos archivos

    $ head login.dat shell.dat
    ==> login.dat <==
    usuario1 u1
    usuario2 u2
    usuario3 u3
    
    ==> shell.dat <==
    usuario1 bash
    usuario2 cshell
    usuario3 bash
    
    $ paste login.dat shell.dat
    usuario1 u1   usuario1 bash
    usuario2 u2   usuario2 cshell
    usuario3 u3   usuario3 bash
    
  • join mezcla el contenido de dos archivos

    $ join login.dat shell.dat
    usuario1 u1 bash
    usuario2 u2 cshell
    usuario3 u3 bash
    
  • diff obtiene la diferencia entre dos archivos

    $ sed 's/u3/U3/g' login.dat > login2.dat
    $ diff login.dat  login2.dat
    3c3
    < usuario3 u3
    ---
    > usuario3 U3
    
    $ diff -yW60 login.dat  login2.dat
    usuario1 u1            usuario1 u1
    usuario2 u2            usuario2 u2
    usuario3 u3         |  usuario3 U3