Android

Πώς να διαβάσετε μια γραμμή αρχείων ανά γραμμή στο bash

PHP Syntax

PHP Syntax

Πίνακας περιεχομένων:

Anonim

Όταν γράφετε σενάρια Bash, μερικές φορές θα βρεθείτε σε καταστάσεις όπου πρέπει να διαβάσετε μια γραμμή αρχείων ανά γραμμή. Για παράδειγμα, μπορεί να έχετε ένα αρχείο κειμένου που περιέχει δεδομένα που πρέπει να επεξεργαστούν από το σενάριο.

Σε αυτό το σεμινάριο, θα συζητήσουμε πώς να διαβάσετε μια γραμμή αρχείων ανά γραμμή στο Bash.

Ανάγνωση μιας γραμμής αρχείου με τη σύνταξη γραμμής

Η πιο γενική σύνταξη για την ανάγνωση ενός αρχείου γραμμής με γραμμή έχει ως εξής:

while IFS= read -r line do echo "$line" done < input_file

ή την ισοδύναμη έκδοση μιας γραμμής:

while IFS= read -r line; do echo $line; done < input_file

Πώς λειτουργεί;

Το αρχείο εισόδου ( input_file ) είναι το όνομα του αρχείου που θέλετε να ανοίξετε για ανάγνωση από την εντολή read . Η εντολή read διαβάζει τη γραμμή αρχείου ανά γραμμή, αντιστοιχίζοντας κάθε γραμμή στη μεταβλητή line . Μόλις επεξεργαστούν όλες οι γραμμές, ο βρόχος while θα τερματιστεί. Ο εσωτερικός διαχωριστής πεδίων ( IFS ) έχει οριστεί ως η μηδενική συμβολοσειρά για να διατηρήσει το κενό και το τελικό διάστημα, το οποίο είναι η προεπιλεγμένη συμπεριφορά της εντολής read .

Ανάγνωση παραδειγμάτων γραμμής αρχείου ανά γραμμή

Ας ρίξουμε μια ματιά στο παρακάτω παράδειγμα. Ας υποθέσουμε ότι έχουμε ένα αρχείο που ονομάζεται distros.txt περιέχει μια λίστα με μερικές από τις πιο δημοφιλείς διανομές Linux και τους διαχειριστές πακέτων τους χωρισμένους με κόμμα ( , ):

distros.txt

Ubuntu, apt Debian, apt CentOS, yum Arch Linux, pacman Fedora, dnf

Για να διαβάσετε τη γραμμή αρχείων ανά γραμμή, θα εκτελέσετε τον ακόλουθο κώδικα στο τερματικό σας:

while IFS= read -r line do echo "$line" done < distros.txt

Ο κώδικας θα διαβάσει το αρχείο ανά γραμμή, θα αντιστοιχίσει κάθε γραμμή σε μια μεταβλητή και θα αντηχεί την μεταβλητή. Βασικά, θα δείτε την ίδια έξοδο σαν να εμφανίζατε το περιεχόμενο του αρχείου χρησιμοποιώντας την εντολή cat.

Τι γίνεται αν θέλετε να εκτυπώσετε μόνο τις διανομές που χρησιμοποιούν apt; Ένας τρόπος θα ήταν να χρησιμοποιήσετε τη εντολή if και να ελέγξετε αν η γραμμή περιέχει το apt substring:

while IFS= read -r line do if]; then echo "$line" fi done < distros.txt

Ubuntu, apt Debian, apt

Κατά την ανάγνωση της γραμμής αρχείου κατά γραμμή, μπορείτε επίσης να περάσετε περισσότερες από μία μεταβλητές στην εντολή ανάγνωσης που θα διαιρέσει τη γραμμή σε πεδία που βασίζονται στο IFS . Το πρώτο πεδίο αντιστοιχεί στην πρώτη μεταβλητή, στη δεύτερη στη δεύτερη μεταβλητή κ.ο.κ. Αν υπάρχουν περισσότερα πεδία από τις μεταβλητές, τα πεδία που απομένουν έχουν εκχωρηθεί στην τελευταία μεταβλητή.

Στο ακόλουθο παράδειγμα, ρυθμίζουμε το IFS σε ένα κόμμα ( , ) και διαβιβάζουμε δύο μεταβλητές distro και pm στην εντολή ανάγνωσης. Τα πάντα από την αρχή της γραμμής μέχρι το πρώτο κόμμα θα ανατεθούν στην πρώτη μεταβλητή ( distro ) και η υπόλοιπη γραμμή θα εκχωρηθεί στη δεύτερη μεταβλητή ( pm ):

while IFS=, read -r distro pm do echo "$pm" is the package manager for "$distro" done < distros.txt

apt is the package manager for Ubuntu apt is the package manager for Debian yum is the package manager for CentOS pacman is the package manager for Arch Linux dnf is the package manager for Fedora

Εναλλακτικές μέθοδοι ανάγνωσης αρχείων

Χρησιμοποιώντας μια αντικατάσταση διαδικασίας

Η υποκατάσταση της διαδικασίας σάς επιτρέπει να μεταβιβάσετε την έξοδο από την εντολή ως όνομα αρχείου:

while IFS= read -r line do echo "$line" done < <(cat input_file)

Χρησιμοποιώντας μια συμβολοσειρά Here

Here String είναι μια παραλλαγή του εγγράφου Here. Η συμβολοσειρά (cat input_file) θα διατηρήσει τις νέες γραμμές:

while IFS= read -r line do echo "$line" done <<< $(cat input_file)

Χρησιμοποιώντας τον περιγραφέα αρχείων

Μπορείτε επίσης να δώσετε την είσοδο στον βρόχο χρησιμοποιώντας έναν περιγραφέα αρχείου:

while IFS= read -r -u9 line do echo "$line" done 9< input_file

Όταν εργάζεστε με περιγραφείς αρχείων χρησιμοποιήστε έναν αριθμό μεταξύ 4 και 9 για να αποφύγετε τη σύγκρουση με τους περιγραφείς εσωτερικών αρχείων κελύφους.

συμπέρασμα

Στο Bash, μπορούμε να διαβάσουμε ένα αρχείο γραμμής με γραμμή, παρέχοντας το όνομα αρχείου ως είσοδο σε ένα βρόχο ανάγνωσης.

bash terminal