Comandi Linux e script Bash pratici: ls, find, grep, AWK e esempi funzionanti

Classificato in Informatica

Scritto il in italiano con una dimensione di 8,51 KB

Comandi e script Linux — Domande e soluzioni corrette

Elencare il contenuto di /root/test con nomi tra virgolette e separati da virgole

Specificare il comando di Linux che mostra l'elenco del contenuto di /root/test, con i nomi dei file fra virgolette e separati da virgole.

ls -Q -m /root/test

Elencare tutte le sottodirectory con permessi specifici

Specificare il comando di Linux che consente di elencare tutte le sottodirectory della directory corrente con permessi rwx per il proprietario e r-x per il gruppo.

ls -l | grep '^drwxr-x'

Impostare la C shell come shell di default per root

Specificare il comando di Linux che imposta la C shell come shell di default per l'utente root.

chsh -s /bin/csh root

Script: verificare file e directory, controllare e copiare il file

Scrivere uno script di shell che riceve un file e una directory come argomenti; lo script verifica che il primo argomento sia un file e il secondo una directory. Se il file non esiste nella directory, lo copia; altrimenti segnala che il file esiste.

#!/bin/bash
clear

if [ -f "$1" ]; then
  if [ -d "$2" ]; then
    if ls "$2" | grep -qw "$(basename "$1")"; then
      echo -e "Il file $1 esiste in $2\n"
    else
      cp "$1" "$2"
    fi
  else
    echo -e "Directory non valida\n"
    exit 1
  fi
else
  echo -e "File non valido\n"
  exit 1
fi

File personas.dat e programma AWK per BMI

Creare un file chiamato personas.dat in cui i campi che compongono ciascun record sono: nome, peso (in kg) e altezza (in metri). Il file usa il carattere # come delimitatore di campo. Esempio di personas.dat:

Juan # 80 # 1.75
Paulina # 65 # 1.60

Scrivere un programma AWK chiamato listado_imc che legge il file e genera un elenco delle persone con BMI (IMC) normale. Valori tra 18.5 e 24.99 sono considerati normali. Il BMI è calcolato come BMI = peso / (altezza)^2.

BEGIN { FS = "#"; OFS = "\t"; print "Elenco BMI normale"; printf "Nombre\tIMC\n" }
{
  gsub(/^ +| +$/, "", $1)
  gsub(/^ +| +$/, "", $2)
  gsub(/^ +| +$/, "", $3)
  imc = $2 / ($3 * $3)
  if (imc >= 18.5 && imc <= 24.99)
    printf "%s\t%2.2f\n", $1, imc
}

Esecuzione consigliata:

awk -F'#' -f listado_imc personas.dat
# oppure: awk -f listado_imc personas.dat

Ordine di ricerca in PATH

Dato il seguente contenuto della variabile d'ambiente PATH:

/usr/local/bin:/bin:/usr/bin:.

Se ho un comando chiamato lista nella directory corrente e un altro comando con lo stesso nome in /usr/bin, quale verrà eseguito semplicemente digitando lista al prompt?

Verrà eseguito il comando presente in /usr/bin, perché la directory corrente (.) appare dopo /usr/bin nella variabile PATH.

Script: filtrare linee che iniziano con lettere

Scrivere uno script di shell che riceve due file come argomenti; lo script verifica che i parametri siano forniti e che il primo file (file di input) esista e non sia vuoto. Se il secondo file è valido, salvare su di esso le linee del file di input che iniziano con una lettera (maiuscola o minuscola).

#!/bin/bash
clear

if [ -z "$1" ] || [ -z "$2" ]; then
  echo "Uso: $0 file_input file_output"
  exit 1
fi

if [ -s "$1" ]; then
  if [ -f "$2" ] || [ ! -e "$2" ]; then
    grep '^[a-zA-Z]' "$1" >> "$2"
  else
    echo -e "$2: file non valido\n"
    exit 1
  fi
else
  echo -e "$1: file non esiste o è vuoto\n"
  exit 1
fi

Rimuovere file vuoti che iniziano con 'A' in /root/test

Specificare il comando di Linux che cerca ed elimina, senza conferma, tutti i file regolari vuoti i cui nomi iniziano con la lettera A e che si trovano in /root/test.

find /root/test -type f -name 'A*' -size 0 -exec rm -f {} \;

Estrarre parole che iniziano e finiscono con una vocale

Creare un file palabras.txt con una parola per riga. Estrarre tutte le parole che iniziano e finiscono con una vocale (maiuscola o minuscola) e salvarle in words.txt.

grep -Ei '^[aeiou].*[aeiou]$' palabras.txt > words.txt

Alias per pulire lo schermo, mostrare data e ora su linee separate e elencare permessi

Specificare il comando che crea un alias chiamato list che pulisce lo schermo, stampa la data e l'ora su righe separate e poi elenca i permessi di tutti i file nella directory corrente.

alias list='clear; date "+%F"; date "+%T"; ls -al'

Contare i file regolari nella directory corrente (utilizzando pipe)

Digitare il comando di Linux che conta il numero di file regolari nella directory di lavoro corrente usando canalizzazioni (pipes).

ls -l | grep '^-' | wc -l

File notas_curso e programma AWK per gli approvati

Creare un file chiamato notas_curso in cui ogni record contiene il nome completo dello studente e tre voti, separati da virgole. Esempio:

Juan Perez,3.5,4.7,5.3
Fabres Pauline,2.5,4.7,3.4

Scrivere un programma AWK chiamato listado_aprobados che visualizza l'elenco degli studenti approvati (media >= 4.0). La lista deve avere il seguente formato: Cognome Nome Media.

BEGIN { FS = ","; OFS = "\t"; print "Elenco Approvati"; printf "Cognome\tNome\tMedia\n" }
{
  # rimuove spazi superflui
  gsub(/^ +| +$/, "", $1)
  gsub(/^ +| +$/, "", $2)
  gsub(/^ +| +$/, "", $3)
  gsub(/^ +| +$/, "", $4)

  av = ($2 + $3 + $4) / 3
  if (av >= 4.0) {
    nome_completo = $1
    split(nome_completo, a, " ")
    if (length(a) >= 2) {
      cognome = a[2]
      nome = a[1]
      printf "%s\t%s\t%1.1f\n", cognome, nome, av
    } else {
      printf "%s\t-\t%1.1f\n", nome_completo, av
    }
  }
}

Esecuzione:

awk -f listado_aprobados notas_curso

Impostazioni per la cronologia della shell

I comandi per impostare le variabili d'ambiente in modo che la cronologia dei comandi includa data e ora e rimuova tutte le voci duplicate sono i seguenti (da inserire, ad esempio, in ~/.bash_profile):

export HISTTIMEFORMAT='%F %T '
export HISTCONTROL=erasedups

Script testIP: monitorare connettività delle succursali

Considerare una società con una sede centrale e tre filiali. Per verificare periodicamente la connettività verso le filiali, scrivere uno script chiamato testIP che legge un file (passato come argomento) contenente un indirizzo IP per riga. Effettuare i test di connettività ogni 5 minuti e registrare i risultati in testIP_sucursales.log, includendo data e ora del test.

#!/bin/bash
clear

if [ -z "$1" ]; then
  echo "Uso: $0 file_ip"
  exit 1
fi

while true; do
  while IFS= read -r ip; do
    echo -e "+--------------------------------+" >> testIP_sucursales.log
    date '+%F %T' >> testIP_sucursales.log
    ping -c 3 "$ip" >> testIP_sucursales.log 2>&1
  done < "$1"
  sleep 300
done

Script mostrar_lineas: mostrare linee non vuote con numeri di riga

Scrivere uno script chiamato mostrar_lineas che chiede all'utente il nome del file e poi stampa tutte le linee non vuote del file, con il numero di riga corrispondente.

#!/bin/bash
clear

echo -n "file: "
read file

if [ ! -f "$file" ]; then
  echo "File non trovato: $file"
  exit 1
fi

i=1
while IFS= read -r line; do
  if [ -n "$line" ]; then
    echo -e "$i\t$line"
  fi
  i=$((i+1))
done < "$file"

Nota: tutti gli esempi e gli script proposti devono essere eseguiti con le opportune autorizzazioni; per le operazioni su /root è necessario l'accesso come root o privilegi sudo.

Voci correlate: