Как записать вывод команды Unix 'Top' в файл CSV?

Я пытаюсь получить первые 5 строк top Команда через сценарий оболочки и мне нужно записать вывод в CSV- файл (мне нужно отслеживать результат каждые 15 секунд). Наконец мне нужно построить график с использованием полученной таблицы.

Я получил сценарий оболочки, чтобы написать первые 5 строк top команда в текстовый файл:

#!/bin/bash
echo "execution started.."

top -b -n 3 | sed -n '7,1p' >> out.txt

while [ true ]; do
    sleep 15
    echo "running.."
    top -b -n 3 | sed -n '8, 12p' >> out.txt
done

Вот файл out.txt после нескольких выполнений:

    PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 3983 arun      20   0 1662480 309580  40936 S 26.3  6.4  13:36.00 gnome-shell
17907 arun      20   0  130020   1680   1172 R 10.5  0.0   0:00.03 top
 2016 root      20   0  221792  51172   9636 S  5.3  1.1   4:40.97 Xorg
11917 arun      20   0 7004884 570312  22040 S  5.3 11.7   0:48.83 java
    1 root      20   0   59732   7156   3992 S  0.0  0.1   0:02.71 systemd
 3983 arun      20   0 1662480 309580  40936 S 36.8  6.4  13:37.23 gnome-shell
 2016 root      20   0  221792  51172   9636 S 10.5  1.1   4:41.14 Xorg
 2720 mongod    20   0  624364  33716   5200 R  5.3  0.7   1:44.36 mongod
17918 arun      20   0  130020   1676   1172 R  5.3  0.0   0:00.02 top
    1 root      20   0   59732   7156   3992 S  0.0  0.1   0:02.71 systemd
 3983 arun      20   0 1662480 309580  40936 S 25.0  6.4  13:38.60 gnome-shell
 2720 mongod    20   0  624364  33672   5160 S  5.0  0.7   1:44.46 mongod
12081 arun      20   0 2687496 314248  21436 S  5.0  6.5   3:05.51 java
17922 arun      20   0  130020   1680   1172 R  5.0  0.0   0:00.02 top
    1 root      20   0   59732   7156   3992 S  0.0  0.1   0:02.71 systemd

Но мне нужны те же данные в формате CSV. Я попытался сделать это, указав имя выходного файла как out.csv! Но это не сработало. (Поскольку он был не в правильном формате, все данные были в первой оболочке!)

Можете ли вы предоставить решение для записи того же вывода в CSV- файл?

1 ответ

Решение

Если вы хотите обрезать пробелы и заменить их запятыми, попробуйте

top -b -n 3 | sed -n '8, 12{s/^ *//;s/ *$//;s/  */,/gp;};12q'

sed Скрипт выполняет следующие замены в строках с 8 по 12:

  • Замените все начальные пробелы ничем (в противном случае вы получите пустой первый столбец, когда PID выровнен по правому краю).
  • Замените любые конечные пробелы ничем (аналогично, чтобы избежать пустых полей после данных).
  • Замените все оставшиеся участки соседних пространств запятой. Распечатать эту строку.

Наконец, в строке 12 мы закончили, поэтому мы уходим sed,

Оболочка не обращает никакого внимания на имя файла, на который вы перенаправляете, и, как правило, расширения файлов в Unix являются неофициальными украшениями, а не спецификаторами типов файлов, как на некоторых платформах.

Вы могли бы сделать echo hello >outputfile.ps и на выходе все равно будет текст, а не PostScript (или ряд других возможных интерпретаций .ps расширение файла). В любом случае, echo команда не знает, что она перенаправляется, так как она обрабатывается оболочкой до запуска команды, в любом случае. (Что ж, echo это встроенная оболочка, поэтому теоретически в этом случае может быть некоторая координация.)

Другие вопросы по тегам