Android

Paano magbasa ng isang linya ng file sa pamamagitan ng linya sa bash

Unix shell script to read a file line by line and read word by word from each line

Unix shell script to read a file line by line and read word by word from each line

Talaan ng mga Nilalaman:

Anonim

Kapag nagsusulat ng mga script ng Bash, makikita mo minsan ang iyong sarili sa mga sitwasyon kung saan kailangan mong magbasa ng isang linya ng file sa pamamagitan ng linya. Halimbawa, maaari kang magkaroon ng isang text file na naglalaman ng data na dapat na maiproseso ng script.

Sa tutorial na ito, tatalakayin namin kung paano basahin ang isang linya ng file sa pamamagitan ng linya sa Bash.

Pagbasa ng isang File Line By Line Syntax

Ang pinaka-pangkalahatang syntax para sa pagbabasa ng isang file line-by-line ay ang mga sumusunod:

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

o ang katumbas na bersyon ng solong linya:

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

Paano ito gumagana?

Ang input file ( input_file ) ay ang pangalan ng file na nais mong buksan para sa pagbabasa ng input_file utos. Ang read utos ay nagbabasa ng linya ng file ayon sa linya, na nagtatalaga ng bawat linya sa variable variable. Kapag ang lahat ng mga linya ay naproseso habang ang loop ay magtatapos. Ang panloob na field separator ( IFS ) ay nakatakda sa null string upang mapanatili ang nangunguna at trailing whitespace na kung saan ay ang default na pag-uugali ng utos na read .

Pagbasa ng isang File Line Ayon sa Mga Halimbawa ng Linya

Tingnan natin ang sumusunod na halimbawa. Ipagpalagay, mayroon kaming isang file na nagngangalang distros.txt naglalaman ng isang listahan ng ilan sa mga pinakatanyag na pamamahagi ng Linux at ang kanilang mga tagapamahala ng pakete na pinaghiwalay sa kuwit ( , ):

distros.txt

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

Upang mabasa ang linya ng file ayon sa linya ay tatakbo mo ang sumusunod na code sa iyong terminal:

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

Babasahin ng code ang taludtod ng taludtod, itatalaga ang bawat linya sa isang variable, at i-echo ang variable. Ang pangunahing kaalaman ay makikita mo ang parehong output na parang ipapakita mo ang nilalaman ng file gamit ang utos ng pusa.

Paano kung nais mong i-print lamang ang mga pamamahagi na gumagamit ng angkop? Ang isang paraan ay ang paggamit kung ang pahayag at suriin kung ang linya ay naglalaman ng apt substring:

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

Ubuntu, apt Debian, apt

Kapag binabasa ang linya ng file ayon sa linya, maaari mo ring ipasa ang higit sa isang variable sa basahin na utos na hahatiin ang linya sa mga patlang batay sa IFS . Ang unang patlang ay itinalaga sa unang variable, ang pangalawa sa pangalawang variable, at iba pa. Kung mayroong higit na mga patlang kaysa sa mga variable, ang mga natitirang patlang ay itinalaga sa huling variable.

Sa mga sumusunod na halimbawa, inilalagay namin ang IFS sa isang kuwit ( , ) at ipinapasa ang dalawang variable na distro at pm sa pagbasa ng utos. Ang lahat mula sa simula ng linya hanggang sa unang kuwit ay itatalaga sa unang variable ( distro ) at ang natitirang linya ay itatalaga sa pangalawang variable ( 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

Mga Alternatibong Pamamaraan sa Pagbasa ng File

Paggamit ng isang Pagpapalit ng Proseso

Pinapayagan ka ng pagpapalit ng proseso na maipasa ang output mula sa utos bilang isang filename:

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

Paggamit ng isang Narito String

Narito ang String ay isang variant ng dokumento na Narito. Ang string (cat input_file) ay panatilihin ang mga newlines:

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

Gamit ang File descriptor

Maaari mo ring ibigay ang pag-input sa loop gamit ang isang descriptor ng file:

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

Kapag nagtatrabaho sa mga naglalarawang file gumamit ng isang numero sa pagitan ng 4 at 9 upang maiwasan ang salungatan sa mga deskriptor ng internal na file.

Konklusyon

Sa Bash, maaari nating basahin ang isang file line-by-line sa pamamagitan ng pagbibigay ng filename bilang isang input sa isang habang nababasa ang loop.

terminal ng bash