Apa artinya `o *`?

1

Menampilkan jumlah CPU yang digunakan di terminal dalam% Pertanyaan tidak dipahami di tengah pembuatan skrip 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}'

Apa yang o2disukai o2, o4, o5? itu pertanyaan konyol?

DavidPostill
sumber

Jawaban:

2

Mereka adalah variabel dalam awkskrip ... Format ini mungkin membuatnya lebih jelas:

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
    }'

Anda mengambil setiap baris yang memiliki "cpu" di dalamnya dari /proc/stat:

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

Lakukan ini setiap 5 detik:

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

Dan menyalurkan output ke awk. awkadalah mengambil bidang 2, 4 dan 5 ( $2, $4dan $5) melakukan perhitungan, dan menyimpannya dalam variabel o2, o4dan o5.

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

Anda dapat menemukan informasi lebih lanjut tentang /proc/statdari halaman manual, di sini .

/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.

                     [...]
Attie
sumber
1

O2, o4 dan o5 tidak ada artinya. Mereka terlihat seperti seharusnya variabel, tetapi variabel ditetapkan setelah perhitungan. Jika Anda ingin menggunakan variabel, Anda harus mengaturnya sebelum menggunakannya.

Berikut ini adalah perhitungan yang lebih sederhana untuk menggambarkan masalahnya. Saya ingin menambahkan dua angka.

$ 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

awk memutuskan untuk menggunakan 0 untuk mewakili nilai yang tidak disetel dalam perhitungan.

Melihat perhitungan cpu, pada dasarnya melakukan hal berikut:

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

Anda berakhir dengan angka negatif dibagi dengan angka negatif menghasilkan angka positif.

Dalam hal ini, berikut ini sudah cukup:

$ grep -w cpu /proc/stat | awk '{ print ($2+$4)*100/($2+$4+$5) "%" }'
Carlos Hanson
sumber