BASH передает переменную в grep, чтобы получить другой результат - PullRequest
0 голосов
/ 27 ноября 2018

Скрипт:

echo $1 $n
while true 
do
  ps -aux | awk '{print $1 "\t" $3 "\t" $4 "\t" $11}'  > task.log
  while IFS=' ' read r
  do 
    echo $r
  done < task.log | grep "$n" | awk '/a/{sum+=$1} END{print"Total CPU Usage:", sum}' >> monitor2.log
  sleep $1
done

Это простой скрипт, позволяющий увидеть использование процессора с помощью результата -aux в файле task.log и позволить grep и awk обработать его все, введя ключевое слово

Проблема в том, что результат всегда, когда я запускаю ./monitor1.sh 2 firefox

Общее использование ЦП: 0

Я проверял, если я добавлю grep, заменим $ n на firefox ине переменная, вывод

Общее использование ЦП: 1.1

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

В вашем скрипте:

  • Вы нигде не назначаете переменную "$ n", поэтому она пуста.Возможно, вы хотите использовать n=$2 или просто использовать позиционную переменную $2 вместо
  • "task.log" бесполезно, если вы хотите использовать tee для передачи к нему
  • Doingps -axu, а затем ограничение столбцов awk выглядит странно.ps может форматировать вывод самостоятельно
  • Синтаксический анализ ps | grep плох, используйте pgrep для этого
  • не забудьте процитировать переменные

Ваш скриптпосле некоторого исправления это может выглядеть следующим образом:

while true; do
  cpuusage=$(
      pgrep "$2" | 
      tee >(xargs ps -aux >task.log) | 
      xargs ps -o cpu% |
      awk '{sum += $1} END {print sum}'
  )
  echo "Total CPU Usage: $cpuusage" >> monitor2.log
  sleep "$1"
done
  • pgrep - лучшая альтернатива ps -aux | grep ...
  • xargs проходов pgrep с выходом ps -o %cpu=
  • ps -o %cpu= выводит процент использования процессора для каждого процесса
  • awk используется для его суммирования.
  • Затем простой эхо-сигнал добавляется к monitor2.log файлу.
0 голосов
/ 27 ноября 2018

Полагаю, вам нужно что-то вроде этого:

ps aux | awk '$11 ~ /firefox/{ sum += $3 } END { print sum }'

awk проверяет поле 11 каждой строки, созданной ps, и, если оно содержит firefox, оно выполняет связанную {} блок.Помните, что в разных системах выходы ps различны.

Вы хотите выполнить это в команде watch.Например.вот так (обратите внимание, как можно избежать цитирования ада с помощью переменных awk).

ps-sum() { ps aux | awk -v regex=$1 '$11 ~ regex { sum += $3 } END { print sum }' ;}
export -f ps-sum

watch -x bash -c "ps-sum firefox"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...