Introduzione
La lettura di un file riga per riga consente di elaborare in modo efficace il contenuto di un file e di visualizzare ogni riga come elemento di un elenco. Dopo aver visualizzato ciascuna riga separatamente, cerca o abbina facilmente qualsiasi contenuto specifico.
Uno dei modi per leggere un file di testo in singole righe è usare la shell Bash.
In questo tutorial imparerai a leggere un file riga per riga in Bash.
Prerequisiti
- Un sistema che esegue Linux.
- Accesso a un terminale (Ctrl + Alt + T ).
- Un editor di testo (come Nano o vi/vim).
Lettura riga per riga in Bash
Esistono diversi metodi per leggere un file riga per riga usando Bash. Le sezioni seguenti evidenziano cinque metodi per elaborare un file una riga alla volta utilizzando Bash.
Metodo 1:utilizzo del comando Read e While Loop
Il primo metodo consiste nell'usare il comando read e un while ciclo in uno script Bash. Sebbene sia possibile fare lo stesso in un terminale, gli script Bash salvano il codice e lo rendono riutilizzabile. Segui i passaggi seguenti:
1. Apri il terminale (Ctrl + Alt + T ) e crea un nuovo script Bash usando un editor di testo come vi/vim:
vi line.sh 2. Immettere le seguenti righe:
#!/bin/bash
file="days.txt"
while read -r line; do
echo -e "$line\n"
done <$file - Il
$fileLa variabile è definita dopo la riga shebang (la prima riga negli script Bash) e memorizza il percorso del file di input che si desidera elaborare.
- Il
-rargomento aggiunto allareadil comando impedisce l'interpretazione di eventuali caratteri con escape barra rovesciata durante la lettura del contenuto del file.
- Il contenuto di ogni riga è memorizzato nella
$linevariabile. Entro ilwhileloop, il comando echo stampa la$linecontenuto della variabile. Il-eargomento consenteechoper interpretare caratteri speciali come il carattere di nuova riga\n.
- Il
whileil ciclo continua finché non raggiunge la fine del file e il ciclo termina.
3. Salva lo script ed esci da vi:
:wq 4. Esegui lo script:
bash line.sh
Lo script restituisce ciascuna riga del file di testo di esempio separatamente.
Metodo 2:utilizzo di cat Command e for Loop
Un altro metodo per visualizzare il contenuto di un file in singole righe consiste nell'usare il comando cat e il for ciclo continuo. Il for loop consente echo per stampare le righe dal cat output del comando fino a raggiungere la fine del file.
Segui i passaggi seguenti:
1. Crea un nuovo script:
vi readfile.sh 2. Immettere le seguenti righe:
#!/bin/bash
file=$(cat days.txt)
for line in $file
do
echo -e "$line\n"
done - Il
$fileLa variabile memorizza il contenuto del file di input utilizzando ilcatcomando.
- Il
forloop scorre ogni riga delcatoutput del comando e lo stampa usando ilechocomando fino a raggiungere la fine del file.
3. Salva lo script ed esci da vi:
:wq 4. Esegui lo script:
bash readfile.sh
Lo script restituisce il contenuto del file riga per riga nell'output standard.
Metodo 3:usare qui le stringhe
Un altro metodo per stampare il contenuto di un file riga per riga consiste nell'usare un here stringa per inviare il contenuto del file al read comando. Il here string collega il contenuto di una variabile, una stringa o un file specificato dopo il <<< sintassi allo standard input del programma invocato.
Segui i passaggi seguenti:
1. Crea un nuovo script Bash:
vi herestrings.sh 2. Immettere le seguenti righe:
#!/bin/bash
while IFS= read -r line; do
printf '%s\n' "$line"
done <<< $(cat days.txt ) - Nel
whileciclo, ilIFS=argomento è una stringa vuota per evitare di tagliare gli spazi bianchi.
- Il
-rargomento impedisce l'interpretazione dei caratteri con escape barra rovesciata.
- Il
printfcomando stampa ogni riga del file. Gli specificatori di formato considerano l'input come una stringa (%s) e aggiungi un carattere di nuova riga (\n) dopo ogni riga.
- Il
herestring alimenta ilcatoutput del comando sureadcomando.
3. Salva lo script ed esci dall'editor:
:wq 4. Esegui lo script:
bash herestrings.sh
L'output stampa riga per riga il contenuto del file.
Metodo 4:utilizzo dei descrittori di file
Un descrittore di file si riferisce a un file o processo aperto. Ogni processo ha tre descrittori di file predefiniti:
0. Ingresso standard.1. Uscita standard.2. Errore standard.
Fornisci l'input per il read comando utilizzando un descrittore di file e genera separatamente ogni riga dal contenuto del file. Segui i passaggi seguenti:
1. Crea un nuovo script bash:
vi descriptors.sh 2. Immettere le seguenti righe:
#!/bin/bash
while IFS= read -r -u9 line; do
printf '%s\n' "$line"
done 9< days.txt - Nel
whileloop, istruisci ilreadcomando per leggere l'input da un descrittore di file specificando il-uargomento e il numero del descrittore di file.
Importante: Quando specifichi i descrittori di file, usa un numero compreso tra 4 e 9 per evitare conflitti con i descrittori di file della shell interni.
- Il
printfil comando tratta l'input$linevariabile come stringa (%s) e aggiunge un carattere di nuova riga (\n) dopo aver stampato il$linecontenuti.
- Il
9<la sintassi contiene lo stesso numero del descrittore di file delwhileciclo continuo. Il contenuto del file di input viene inviato al descrittore di file specificato.
3. Salva lo script:
:wq 4. Esegui lo script per testare il codice:
bash descriptors.sh
L'output dello script stampa ogni riga del file separatamente.
Metodo 5:utilizzo della sostituzione del processo
La sostituzione del processo consente all'output standard di uno o più processi di apparire come un file e lo inserisce nell'input standard di un altro processo. Utilizzare la sostituzione del processo per fornire il file di input e stampare ciascuna riga di file separatamente.
Segui i passaggi seguenti:
1. Crea uno script Bash:
vi substitution.sh 2. Immettere le seguenti righe:
#!/bin/bash
while IFS= read -r line; do
printf '%s\n' "$line"
done < <(cat days.txt) - Dopo aver chiuso il ciclo,
catil file di input racchiuso tra parentesi<(cat [input_file_path]per inviare il risultato del processo alreadcomando.
Importante: Fai attenzione a non aggiungere spazi bianchi tra il < carattere e la parentesi a sinistra ( . L'utilizzo di uno spazio vuoto interpreta il codice come un reindirizzamento e genera un errore.
3. Salva lo script:
:wq 4. Esegui lo script:
bash substitution.sh
Ciascuna riga del file viene stampata separatamente nell'output standard.