Как распечатать n-ю колонку в файле с помощью awk?

Устранение проблем с производительностью в Linux - непростая задача, и я не буду описывать все возможности. Однако большинство проблем обычно делятся на 3 категории: высокая загрузка ЦП , высокая загрузка памяти или использование ввода-вывода . ПРИМЕЧАНИЕ: все они взаимосвязаны.

Первый тип: top -b -n 1 | head -15

Это даст вам следующий результат:

top - 15:32:09 up 19 days,  2:32,  2 users,  load average: 0.61, 0.46, 0.42
Tasks: 208 total,   1 running, 207 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.9%us,  3.6%sy,  0.0%ni, 95.2%id,  0.3%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  16430432k total, 15188864k used,  1241568k free,   304624k buffers
Swap:  2097148k total,      112k used,  2097036k free,  7342636k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
16106 user   20   0 4070m 2.1g 2.1g S   30 13.5   4678:57 VirtualBox
26070 user  20   0 6113m 749m 697m S    6  4.7 628:55.93 VirtualBox
14863 user   9 -11  272m 3192 1804 S    2  0.0   5:57.19 pulseaudio
    1 root      20   0 24724 2548 1276 S    0  0.0   0:05.32 init
    2 root      20   0     0    0    0 S    0  0.0   0:00.15 kthreadd
    3 root      20   0     0    0    0 S    0  0.0   0:33.45 ksoftirqd/0
    6 root      RT   0     0    0    0 S    0  0.0   0:03.74 migration/0
    7 root      RT   0     0    0    0 S    0  0.0   0:02.51 watchdog/0

Сначала посмотрите на среднюю нагрузку . Проверьте здесь , чтобы понять, что это означает (очень важно понимать эту концепцию).

ВАЖНО: Здесь ниже я предполагаю, что у вас одноядерный (1 ЦП, без двухъядерного процессора, ...)

Если средняя загрузка меньше 1 через 5 минут, значит, загрузка ЦП в порядке. На данный момент я не уверен, что это могло быть. Продолжайте устранять неполадки, как если бы это было НЕ нормально.

Если средняя загрузка больше 1 через 5 минут, значит, загрузка ЦП высока. Чтобы понять, почему загрузка ЦП высока, проверьте следующие записи в выходных данных, указанных сверху:

В выходных данных выше вы можете увидеть список процессов. Посмотрите на столбец % CPU и проверьте, видите ли вы процессы, использующие 100%. Тот факт, что они используют 100% ЦП, может быть, а может и не быть проблемой, но в качестве теста было бы хорошо их остановить.

Чтобы остановить процесс наверху, нажмите «k» и введите значение, найденное в PID для данного процесса.

ВАЖНО: Запишите название процесса. Прежде чем убивать кого-либо, попробуйте понять, что они делают (поиск в гугле). Вы можете остановить только тот процесс, которым владеете (отметьте в столбце USER) как обычный пользователь (в противном случае вы должны быть пользователем root, но будьте осторожны с тем, что вы убиваете, в случае сомнений не делайте этого). Также обратите внимание на значения % us и % sy , us обозначает пользователя, а sy - систему. В основном они соответственно представляют использование ЦП в пространстве пользователя и пространстве ядра.

Если система ускоряется, то, вероятно, причиной проблемы является убитый вами процесс. В противном случае продолжить.

Считайте значение в % wa . Это высоко? (более 50%), если он высокий, это означает, что входы / выходы (I / O) на диск высоки и ЦП ожидает. Используйте команду iostat , чтобы определить, какой диск медленный.

Вы также можете проверить использование памяти.

Введите бесплатно -m в командной строке. Вы должны увидеть что-то вроде этого:

                 total       used       free     shared    buffers     cached
Mem:         16045      14835       1209          0        298       7172
-/+ buffers/cache:       7365       8679
Swap:         2047          0       2047

Проверьте значение в используемых буферах / кэше. Если используется слишком много памяти, значение должно быть близким к общему.

Проверьте также используемое значение в разделе подкачки (если у вас есть раздел подкачки). Если он высокий, что означает близкое к максимальному значению, наблюдаемому в разделе total (для Swap), то это означает, что ваша система много меняет местами, а это означает, что она выполняет подкачку на диск (что намного медленнее, чем RAM).

Опять же, это может не решить вашу проблему, но это хорошее начало.

1
19.02.2019, 16:02
4 ответа

Вы можете сделать все это в операторе BEGIN, используяgetline

awk '
  BEGIN {
    while(1) {
      line = sep = ""
      for (i = 1; i < ARGC; i++) {
        if ((getline < ARGV[i]) <= 0) exit
        line = line sep $2
        sep = OFS
      }
      print line
    }
  }' input{1..n} > out
3
27.01.2020, 23:18

Вы можете создать команду pasteдля объединения всех вторых столбцов:

cmd="paste"
for x in input{1..n}; do
   cmd="$cmd <(awk '{print \$2;}' $x)"
done
echo $cmd
eval $cmd
2
27.01.2020, 23:18

используя этот пост в качестве ссылки

awk '{a[FNR] = a[FNR]" " $2}END{for(i=1;i<=FNR;i++) print a[i]}' input{1..n}

массив содержит каждую строку из разных файлов

FNR количество записей, прочитанных в текущем входном файле, обнуляется в начале каждого файла.

END{for(i=1;i<FNR;i++) print a[i]} 

печатает содержимое массива a в конце файла

1
27.01.2020, 23:18

Я бы использовал инструмент pr, предназначенный для столбцов данных :

.
awk '{print $2}' input{1..n} | pr -t --columns=n > out

Это предполагает, что каждый файл имеет одинаковое количество строк.

2
27.01.2020, 23:18

Теги

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