Я хочу витягнути деякі рядки awk
. Чи можливо виконати таке завдання:
ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
Як я можу відобразити деталі з номерів рядків 122 до 129?
Я хочу витягнути деякі рядки awk
. Чи можливо виконати таке завдання:
ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'
Як я можу відобразити деталі з номерів рядків 122 до 129?
Відповіді:
Ви не зрозуміли, як це awk
працює. Зазначена "програма" завжди виконується один раз для кожного рядка (або "запису" у зворотній формі) введення, немає необхідності в FOR
будь-якій подібній конструкції. Просто використовуйте:
багатослівний метод
ls -l | awk 'NR>=122 && NR<=129 { print }'
більш компактний метод
ls -l | awk 'NR==122,NR==129'
Тим дається діапазон для NR
, який є "Запис числа", як правило, це поточна лінія awk
обробляється.
awk
код для такого завдання зазвичай ls -l | awk 'NR==122,NR==129'
.
Ще одним альтернативним методом було б використання 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 .
sed
метод, оскількиsed
він набагато менший (і завантажується швидше), ніжawk
.