O que significa 'o *'?

1

Exibindo a quantidade de CPU usada no terminal em% A questão não está sendo entendida no meio da criação de um script bash.

for x in $(seq 1 11);do sleep 5;grep -w cpu /proc/stat ; done | awk '{
    print (o2+o4-$2-$4)*100/(o2+o4+o5-$2-$4-$5) "%"
    o2=$2;o4=$4;o5=$5}'

O que o2 gosta de o2, o4, o5 significa? é bobagem Pergunta?

    
por Kwon Jihye 18.05.2017 / 18:20

2 respostas

2

Eles são variáveis no script awk ... Essa formatação pode deixar isso mais claro:

for x in $(seq 1 11); do
  sleep 5
  grep -w cpu /proc/stat
done | \
  awk '
    {
      print (o2 + o4 - $2 - $4) * 100 / (o2 + o4 + o5 - $2 - $4 - $5) "%"
      o2=$2
      o4=$4
      o5=$5
    }'

Você está usando qualquer linha que tenha "cpu" contida em /proc/stat :

$ grep -w cpu /proc/stat
cpu  737017 2198 503480 221363877 201487 97326 0 0 0 0

Fazendo isso a cada 5 segundos:

for x in $(seq 1 11); do
  sleep 5
  grep -w cpu /proc/stat
done

E colocando a saída em awk . awk está tomando os campos 2, 4 e 5 ( $2 , $4 e $5 ) fazendo um cálculo e armazenando-os nas variáveis o2 , o4 e o5 .

awk '
    {
      print (o2 + o4 - $2 - $4) * 100 / (o2 + o4 + o5 - $2 - $4 - $5) "%"
      o2=$2
      o4=$4
      o5=$5
    }'

Você pode encontrar mais informações sobre /proc/stat na página man, aqui .

/proc/stat
              kernel/system statistics.  Varies with architecture.  Common
              entries include:

              cpu  3357 0 4313 1362393
                     The amount of time, measured in units of USER_HZ
                     (1/100ths of a second on most architectures, use
                     sysconf(_SC_CLK_TCK) to obtain the right value), that
                     the system spent in various states:

                     [...]

                     nice   (2) Time spent in user mode with low priority
                            (nice).

                     [...]

                     idle   (4) Time spent in the idle task.  This value
                            should be USER_HZ times the second entry in the
                            /proc/uptime pseudo-file.

                     iowait (since Linux 2.5.41)
                            (5) Time waiting for I/O to complete.

                     [...]
    
por 18.05.2017 / 18:34
2

O2, o4 e o5 não significam nada. Eles parecem que devem ser variáveis, mas as variáveis são definidas após o cálculo. Se você quiser usar uma variável, você precisa configurá-la antes de usá-la.

Aqui está um cálculo mais simples para ilustrar o problema. Eu quero adicionar dois números.

$ echo 6 4 | awk '{ print $1 + $2 }'
10

$ echo 6 4 | awk '{
  print o1 + o2    # print the sum of two numbers using unset variables
  print o1, o2     # print the unset variables
  o1=$1            # set the variables
  o2=$2
  print o1, o2     # print the set variables
  }'
0

6 4

o awk decide usar 0 para representar o valor não definido no cálculo.

Olhando para o cálculo da cpu, faz essencialmente o seguinte:

(0 + 0 - x - y) * 100 / (0 + 0 - x - y - z)

Você acaba com um número negativo dividido por um número negativo, gerando um número positivo.

Neste caso, o seguinte seria suficiente:

$ grep -w cpu /proc/stat | awk '{ print ($2+$4)*100/($2+$4+$5) "%" }'
    
por 27.05.2017 / 03:10

Tags