Як запустити awk для деякої кількості рядків.?


18

Я хочу витягнути деякі рядки awk. Чи можливо виконати таке завдання:

ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'

Як я можу відобразити деталі з номерів рядків 122 до 129?


Якби ви це робили в циклі, я б запропонував sedметод, оскільки sedвін набагато менший (і завантажується швидше), ніж awk.
zrajm

Відповіді:


36

Ви не зрозуміли, як це awkпрацює. Зазначена "програма" завжди виконується один раз для кожного рядка (або "запису" у зворотній формі) введення, немає необхідності в FORбудь-якій подібній конструкції. Просто використовуйте:

багатослівний метод

ls -l | awk 'NR>=122 && NR<=129 { print }'

більш компактний метод

ls -l | awk 'NR==122,NR==129'

Тим дається діапазон для NR, який є "Запис числа", як правило, це поточна лінія awkобробляється.


6
Насправді типовий awkкод для такого завдання зазвичай ls -l | awk 'NR==122,NR==129'.
манатура

яка команда для отримання останніх 100 рядків з файлу за допомогою awk
Shihabudheen KM

8

Ще одним альтернативним методом було б використання sed:

ls -l | sed -ne '122,129p'

Але якщо, як підказує ваше запитання, важливо використати awk для цього, займіться коментарем манатурки щодо відповіді Зрайма. Як зазначено в документації awk:

   A  pattern  may  consist  of two patterns separated by a comma; in this
   case, the action is performed for all lines from an occurrence  of  the
   first pattern though an occurrence of the second.

Тож якщо хочете, ви також можете створити більш просунуті умови. Наприклад:

ls -l | awk 'NR==122,/foobar/'

Це розпочнеть вихід у рядку 122 і продовжить до тих пір, поки рядок не містить слово "foobar".

Якщо ви скажете нам фактичний випадок використання, ми можемо допомогти у відповідях, які дають кращий варіант вирішення. Я переживаю, що це звучить як проблема XY .


2

Ще один спосіб зробити це (хоча я віддаю перевагу awkметоду) за допомогою coreutils:

ls -l | tail -n +122 | head -n 8
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.