Печать между линиями 7-13, которые содержат определенную строку (скрипт awk)

Проблемы:

  • При сортировке числовых полей вы, вероятно, захотите чтобы использовать параметр -n : sort -nrk 2 . В противном случае строка со значением 5,0 % CPU окажется выше, чем строка со значением 12,0.
  • В зависимости от реализации ps вы можете использовать параметр - no-headers , чтобы избавиться от grep -v . Это не позволяет вам отбрасывать команды, содержащие PID .
  • Я полагаю, вместо echo ИСПОЛЬЗОВАНИЕ ЦП находится в $ CPU_LOAD , вы имели в виду echo ИСПОЛЬЗОВАНИЕ ЦП в $ CPU_USAGE .
  • Я думаю, вы забыли удалить exit 0 , который вы вставили во время отладки (?).

Стиль:

  • Возможно, вы захотите переместить строку CPU_USAGE_THRESHOLD = 800 в начало файла, так как это наиболее информативная вещь, и она, скорее всего, будет изменена даже после того, как ваш скрипт станет стабильным. .
  • Вы повторяете параметр -e : ps -eo pid -eo pcpu -eo command то же самое, что ps -eo pid -o pcpu -o command (как и ps -eo pid, pcpu, command ).
  • Есть пустое предложение else . Это всегда выглядит так, как будто с этим нужно справиться, но не по какой-то неизвестной причине.
0
27.01.2019, 11:00
3 ответа

Вы поместили логику ограничения строки в блок "BEGIN", который выполняется до того, какawkсчитывает какие-либо данные. Переместите эту логику в основной цикл:

NR >= 7 && NR <= 13 && /word/ { print }

$0является аргументом printпо умолчанию, если он не указан... или, даже короче, как

NR >= 7 && NR <= 13 && /word/

, так как {print}является действием по умолчанию, если ничего не указано.
Основная часть сценария awkимеет форму «шаблон» «действие»; вы хотите, чтобы шаблон префиксил действие, которое вы хотите. Здесь шаблон требует, чтобы три теста были истинными, а действие заключалось в печати строки. Размещение printв отдельной строке означает, что при "прохождении" тестов не происходит "действия", и нет "шаблона" для печати каждой строки --, в результате чего печатается каждая строка.

5
28.01.2020, 02:16

Просто дополняю ответ Джеффа ответом, написанным вsed:

sed -n '7,13 { /expression/ p; }' <file

Это напечатает каждую строку между строками 7 и 13 (включительно ), которая соответствует регулярному выражению expression. Вывод по умолчанию отключен с помощью -n, поэтому будут выводиться только строки, явно напечатанные с помощью команды p.

Прямой перевод приведенного выше сценария sedнаawk:

awk 'NR == 7, NR == 13 { if (/expression/) print }' <file

Условие NR == 7, NR == 13следует читать как «из любой входной записи, для которой NRравно 7, в любую входную запись, для которой NRравно 13», где «входная запись» по умолчанию — это строка и NR— количество записей (строк ), прочитанных на данный момент.

2
28.01.2020, 02:16

Как насчет

awk 'NR>6&&NR<14&&/word/' file
0
28.01.2020, 02:16

Теги

Похожие вопросы