Android

วิธีอ่านไฟล์ทีละบรรทัดในทุบตี

เวก้าผับ ฉบับพิเศษ

เวก้าผับ ฉบับพิเศษ

สารบัญ:

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 เมื่อประมวลผลทุกบรรทัดในขณะที่ลูปจะยุติลง ตัวคั่นฟิลด์ภายใน ( IFS ) ถูกตั้งค่าเป็นสตริงว่างเพื่อรักษาช่องว่างนำหน้าและต่อท้ายซึ่งเป็นพฤติกรรมเริ่มต้นของคำสั่ง read

การอ่านบรรทัดไฟล์ตามตัวอย่างบรรทัด

ลองมาดูตัวอย่างต่อไปนี้ สมมติว่าเรามีไฟล์ชื่อ distros.txt ที่มีรายการการกระจาย Linux ที่ได้รับความนิยมมากที่สุดและตัวจัดการแพ็คเกจของพวกเขาคั่นด้วยเครื่องหมายจุลภาค ( , ):

distros.txt

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

หากต้องการอ่านไฟล์ทีละบรรทัดคุณจะเรียกใช้รหัสต่อไปนี้ใน terminal ของคุณ:

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

รหัสจะอ่านไฟล์ทีละบรรทัดกำหนดแต่ละบรรทัดให้กับตัวแปรและสะท้อนตัวแปร พื้นฐานคุณจะเห็นผลลัพธ์เดียวกันกับที่คุณแสดงเนื้อหาไฟล์โดยใช้คำสั่ง cat

ถ้าคุณต้องการพิมพ์เฉพาะการกระจายที่ใช้ apt วิธีหนึ่งคือใช้คำสั่ง if และตรวจสอบว่าบรรทัดมีสตริงย่อย apt หรือไม่:

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

Ubuntu, apt Debian, apt

เมื่ออ่านไฟล์ทีละบรรทัดคุณยังสามารถส่งผ่านตัวแปรมากกว่าหนึ่งตัวไปยังคำสั่ง read ซึ่งจะแบ่งบรรทัดออกเป็นฟิลด์ตาม IFS เขตข้อมูลแรกถูกกำหนดให้กับตัวแปรแรก, ตัวแปรที่สองถึงตัวแปรที่สองและอื่น ๆ หากมีฟิลด์มากกว่าตัวแปรฟิลด์ฟิลด์ที่เหลือจะถูกกำหนดให้กับตัวแปรสุดท้าย

ในตัวอย่างต่อไปนี้เรากำลังตั้งค่า IFS เป็นเครื่องหมายจุลภาค ( , ) และส่งผ่านสองตัวแปร distro และ pm ไปยังคำสั่ง read ทุกอย่างตั้งแต่ต้นบรรทัดจนถึงเครื่องหมายจุลภาคแรกจะถูกกำหนดให้กับตัวแปรแรก ( 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 String เป็นตัวแปรของเอกสาร Here สตริง (cat input_file) จะเก็บบรรทัดใหม่ไว้:

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

การใช้ไฟล์ descriptor

คุณยังสามารถระบุอินพุตให้กับลูปโดยใช้ file descriptor:

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

เมื่อทำงานกับ file descriptors ให้ใช้ตัวเลขระหว่าง 4 ถึง 9 เพื่อหลีกเลี่ยงข้อขัดแย้งกับ file descriptors ของเชลล์ภายใน

ข้อสรุป

ใน Bash เราสามารถอ่านไฟล์แบบทีละบรรทัดได้โดยระบุชื่อไฟล์เป็นอินพุตไปยังลูป read while

bash terminal