Я хочу извлечь несколько строк с 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
.