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/testElencare 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 rootScript: 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
fiFile 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.60Scrivere 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.datOrdine 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
fiRimuovere 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.txtAlias 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 -lFile 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.4Scrivere 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_cursoImpostazioni 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=erasedupsScript 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
doneScript 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.