Я хочу извлечь несколько строк с 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работает. Указанная «программа» всегда выполняется один раз для каждой строки (или «записи» на языке 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.