BASH传递变量给grep产生不同的结果

时间:2018-11-27 15:20:07

标签: bash grep

脚本:

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

这是一个简单的脚本,可通过在task.log中通过输出-aux结果查看cpu的使用情况,并让grep和awk通过输入关键字来对其求和求和

问题在于,结果总是在我运行./monitor1.sh 2 firefox

CPU总使用量:0

我测试了是否将grep用firefox替换$ n而不是变量,输出为

总CPU使用率:1.1

2 个答案:

答案 0 :(得分:1)

在您的脚本中:

  • 您无处分配变量“ $ n”,因此它为空。可能是您打算使用n=$2或只是使用$2位置变量
  • “ task.log”是无用的,如果您希望使用tee对其进行管道操作
  • 先做ps -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 ...
  • 的更好选择
  • xargspgrep输给ps -o %cpu=
  • ps -o %cpu=显示每个进程的CPU使用百分比
  • awk用于求和。
  • 然后将简单的回显追加到monitor2.log文件中。

答案 1 :(得分:0)

我想你是在追求这样的东西:

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

awk检查ps产生的每一行的字段11,如果它包含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"