Я хочу витягнути деякі рядки 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.