Как запустить awk для некоторого количества строк.?

18

Я хочу извлечь несколько строк с awk. Можно ли выполнить следующую задачу:

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

Как я могу отобразить детали из номеров строк от 122 до 129?

cooldharma06
источник
Если бы вы делали это в цикле, я бы предложил sedметод, так sedкак он намного меньше (и загружается быстрее), чем awk.
Зрайм

Ответы:

36

Вы не поняли, как awkработает. Указанная «программа» всегда выполняется один раз для каждой строки (или «записи» на языке awk) ввода, нет необходимости FORили какой-либо подобной конструкции. Просто используйте:

многословный метод

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

более компактный метод

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

Это дает диапазон для NR, который является «Запись номера», обычно это текущая строка awkобрабатывается.

zrajm
источник
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 .

Ghoti
источник
2

Другой способ сделать это (хотя я предпочитаю awkметод) с помощью coreutils:

ls -l | tail -n +122 | head -n 8
Тердон
источник