Как читать файл построчно в Bash

Thank you for reading this post, don't forget to subscribe!

При напи­са­нии сце­на­ри­ев Bash вы ино­гда ока­же­тесь в ситу­а­ци­ях, когда вам нуж­но читать файл построч­но. Напри­мер, у вас может быть тек­сто­вый файл, содер­жа­щий дан­ные, кото­рые долж­ны обра­ба­ты­вать­ся сценарием.

В этой ста­тье мы рас­ска­жем о том, как построч­но читать файл в Bash.

 

Наи­бо­лее общий син­так­сис для чте­ния фай­ла построчно:

или экви­ва­лент­ная одно­строч­ная версия:

Как это работает?

Вход­ной файл ( input_file) – это имя фай­ла, кото­рый вы хоти­те открыть коман­дой для чте­ния read. Коман­да read­чи­та­ет файл построч­но, при­сва­и­вая каж­дую стро­ку пере­мен­ной line. Как толь­ко все стро­ки обра­бо­та­ны, цикл while пре­кра­тит­ся. Внут­рен­ний раз­де­ли­тель полей (IFS) уста­нав­ли­ва­ет­ся в пустую стро­ку, что­бы сохра­нить началь­ные и конеч­ные про­бе­лы, что явля­ет­ся пове­де­ни­ем коман­ды по умол­ча­нию read.

 

Давай­те посмот­рим на сле­ду­ю­щий при­мер. Пред­по­ло­жим, у нас есть файл с име­нем, distros.txt содер­жа­щий спи­сок неко­то­рых наи­бо­лее попу­ляр­ных дис­три­бу­ти­вов Linux и мене­дже­ры паке­тов, раз­де­лен­ные запятой (,):

distros.txt

Что­бы про­чи­тать файл построч­но, вы долж­ны запу­стить сле­ду­ю­щий код в вашем терминале:

<

Код будет читать файл построч­но, назна­чать стро­ку пере­мен­ной и выво­дить ее. По про­сто­те вы уви­ди­те тот же вывод, что и при отоб­ра­же­нии содер­жи­мо­го фай­ла с помо­щью коман­ды cat.

Что если вы хоти­те рас­пе­ча­тать толь­ко дис­три­бу­ти­вы, кото­рые исполь­зу­ют apt? Один из спо­со­бов – про­ве­рить, содер­жит ли стро­ка под­стро­ку apt :

При чте­нии фай­ла стро­ка за стро­кой вы так­же може­те пере­дать более одной пере­мен­ной в коман­ду чте­ния, кото­рая раз­де­лит стро­ку на поля на осно­ве IFS. Пер­вое поле при­сва­и­ва­ет­ся пер­вой пере­мен­ной, вто­рое – вто­рой пере­мен­ной и т. д. Если полей боль­ше, чем пере­мен­ных, остав­ши­е­ся поля при­сва­и­ва­ют­ся послед­ней переменной.

В сле­ду­ю­щем при­ме­ре мы уста­нав­ли­ва­ем IFS для запя­той (,) и пере­да­ем две пере­мен­ные distro и pm коман­де чте­ния. Все от нача­ла стро­ки до пер­вой запя­той будет при­сво­е­но пер­вой пере­мен­ной ( distro), а осталь­ная часть стро­ки будет назна­че­на вто­рой пере­мен­ной ( pm):

Под­ста­нов­ка про­цес­са поз­во­ля­ет вам пере­да­вать вывод коман­ды в виде име­ни файла:

Здесь Стро­ка явля­ет­ся вари­ан­том доку­мен­та Здесь. Стро­ка (cat input_file ) будет содер­жать новые строки:

Вы так­же може­те предо­ста­вить вход для цик­ла, исполь­зуя дескрип­тор файла:

При рабо­те с фай­ло­вы­ми дескрип­то­ра­ми исполь­зуй­те чис­ло от 4 до 9, что­бы избе­жать кон­флик­та с внут­рен­ни­ми фай­ло­вы­ми дескрип­то­ра­ми оболочки.