GNU/Linux >> Linux Esercitazione >  >> Linux

Scripting Bash:come leggere i dati dai file di testo

Qualcosa che mi piace in Linux (e nei sistemi simili a Unix in generale) è che le configurazioni e le proprietà sono contenute in file di testo. Ciò consente a un amministratore con le autorizzazioni corrette per esaminare i file e apportare modifiche se necessario. I file di testo sono anche fonti di dati semplici e convenienti per le operazioni tipiche di un amministratore di sistema. In determinate situazioni, puoi utilizzare i file di testo come output da condividere anche con gli utenti regolari. Tratto esempi di entrambi i casi in questo articolo.

Nota :scrittura su stdout e leggendo da stdin usare le pipe è come usare un file di testo virtuale. In molti casi, lo fai hai un file di testo, ma in altri usi semplicemente l'output di qualche comando precedente come se fosse un file di testo.

[ Potrebbe interessarti anche: I miei 8 pratici comandi Linux preferiti ]

Quindi, quando dovresti usare un metodo o l'altro? Bene, in alcuni casi, il file di testo esiste già, come il /etc/hosts file, per esempio. In altri casi, non è necessario che il file venga scritto fisicamente perché sei interessato solo al risultato (e la struttura dei dati è davvero semplice). Diversi scenari potrebbero richiedere l'archiviazione delle informazioni in un file per motivi quali chiarezza, risoluzione dei problemi, controllo o capacità di analizzare la struttura delle informazioni e altri tipi di contenuti disponibili.

Verifica la raggiungibilità e la risoluzione dei nomi per un elenco di server

Supponiamo di avere un elenco di nuove macchine e di dover verificare che:

  1. Sono raggiungibili dal tuo server
  2. Fai in modo che la risoluzione dei nomi funzioni per loro
  3. Sono in ascolto sulla porta 22 (per SSH)

Devi anche segnalare lo stato al team di progetto per il quale devi inviare in un foglio di calcolo. Se stai lavorando con dozzine di server e devi ripetere questi test in giorni diversi, è sicuramente utile pensare a un modo automatizzato per farlo.

Il file di input

Questo è il foglio di lavoro in cui ho ottenuto il file CSV (comma-separated value) utilizzato nei seguenti esempi.

E questo è il file CSV:

ServerName,IP
m2.example.com,192.168.2.99
xtower.example.com,192.168.2.111
win2k16.example.com,192.168.101.41
control.example.com,192.168.101.200
node1.example.com,192.168.101.201
node2.example.com,192.168.101.202
node3.example.com,192.168.101.203
node4.example.com,192.168.101.204
node5.example.com,192.168.101.205

(La conversione del foglio di lavoro in/da CSV è stata eseguita manualmente e non sarà trattata in questo articolo.)

Il copione

Quello che segue è lo script che utilizzo per testare i server:

1     #!/bin/bash
2     
3     input_file=hosts.csv
4     output_file=hosts_tested.csv
5     
6     echo "ServerName,IP,PING,DNS,SSH" > "$output_file"
7     
8     tail -n +2 "$input_file" | while IFS=, read -r host ip _
9     do
10        if ping -c 3 "$ip" > /dev/null; then
11            ping_status="OK"
12        else
13            ping_status="FAIL"
14        fi
15    
16        if nslookup "$host" > /dev/null; then
17            dns_status="OK"
18        else
19            dns_status="FAIL"
20        fi
21    
22        if nc -z -w3 "$ip" 22 > /dev/null; then
23            ssh_status="OK"
24        else
25            ssh_status="FAIL"
26        fi
27    
28        echo "Host = $host IP = $ip" PING_STATUS = $ping_status DNS_STATUS = $dns_status SSH_STATUS = $ssh_status
29        echo "$host,$ip,$ping_status,$dns_status,$ssh_status" >> $output_file
30    done

I seguenti elementi di riga spiegano le voci di script sopra:

Riga 6: Inizializza il file di output con l'intestazione e tre nuovi campi per rappresentare lo stato di raggiungibilità tramite ping e risoluzione del nome

Riga 8: Leggi il file di input riga per riga utilizzando un while loop, ignorando la prima riga (intestazione). Crea anche le variabili per host e ip, estraendo i valori usando il separatore (virgola) e ignorando il resto.

Righe da 10 a 26: Esegui il pingnslookupnc comandi, inviando l'output a null perché siamo interessati solo allo stato di ritorno dai comandi

Riga 28: Invia l'output a stdout per la persona che esegue lo script

Riga 29: Invia i dati al file di output con le tre nuove colonne (ping_status, dns_status e ssh_status)

Apri il file di output come foglio di calcolo

Invia il file di output a una workstation dove puoi aprirlo nella tua applicazione per fogli di calcolo preferita. Se lo invii a persone non tecniche, potresti voler salvarlo nel formato di foglio di lavoro predefinito utilizzato in azienda per semplificargli la vita.

[ Cheat sheet gratuito:ottieni un elenco di utilità e comandi Linux per la gestione di server e reti. ] 

Concludi

In questo articolo ho applicato alcuni strumenti comuni e semplici disponibili su tutti i sistemi Linux per automatizzare il test di raggiungibilità, risoluzione dei nomi e connettività tramite SSH. In alcuni progetti, questo tipo di validazione dovrebbe essere eseguita per decine di server e ripetuta un numero significativo di volte a causa dei processi di modifica che coinvolgono altri team (Rete e Firewall, ad esempio).

I principi possono essere estesi ad altri tipi di test. Ad esempio, puoi testare la connettività per una porta diversa. Se i test diventano più complessi, ad esempio esegui un comando sull'host se è raggiungibile tramite SSH , allora hai a che fare con un diverso tipo di problema, che richiede uno strumento diverso. E per una situazione del genere, ti consiglio vivamente di rivolgerti ad Ansible.


Linux
  1. Come spostare 100 file da una cartella che ne contiene migliaia?

  2. Creare dati di lettura di testo da un file?

  3. Come leggere una variabile da un file?

  4. Come distinguere il binario dai file di testo in Linux

  5. Come rimuovo le nuove righe da un file di testo?

Come confrontare e unire file di testo su Linux

Come creare directory da un file di testo in Linux

Come visualizzare i dati da un file di testo in Linux

Scripting Bash:come scrivere dati su file di testo

Come estrarre indirizzi e-mail da file di testo in Linux

Come rimuovere tutti i caratteri di spazio bianco da un file di testo