Если бы вы делали это в цикле, я бы предложил sedметод, так sedкак он намного меньше (и загружается быстрее), чем awk.
Зрайм
Ответы:
36
Вы не поняли, как 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'.
Манатворк
какая команда для получения последних 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 thiscase, 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
.Ответы:
Вы не поняли, как
awk
работает. Указанная «программа» всегда выполняется один раз для каждой строки (или «записи» на языке awk) ввода, нет необходимостиFOR
или какой-либо подобной конструкции. Просто используйте:многословный метод
более компактный метод
Это дает диапазон для
NR
, который является «Запись номера», обычно это текущая строкаawk
обрабатывается.источник
awk
код для такой задачи обычноls -l | awk 'NR==122,NR==129'
.Еще один альтернативный метод будет использовать
sed
:Но если, как подсказывает ваш вопрос, для этого важно использовать awk, используйте комментарий Манатворка к ответу Зрайма. Как указано в документации awk:
Поэтому, если вы хотите, вы также можете сделать более сложные условия. Например:
Это будет начинать вывод со строки 122 и продолжаться до тех пор, пока строка не будет содержать слово «foobar».
Если вы сообщите нам реальный вариант использования, мы сможем помочь с ответами, которые обеспечат лучшее решение. Я беспокоюсь, что это звучит как проблема XY .
источник
Другой способ сделать это (хотя я предпочитаю
awk
метод) с помощью coreutils:источник