С помощью сценариев BASH я проверяю связь с более чем 50 устройствами в компьютерной сети и отслеживаю, когда эти устройства выходят из строя. С помощью sed и некоторых других утилит, когда пинг не возвращается, он записывается в файл CSV и обрабатывается 3 раза в день.
Файл CSV имеет такой формат, как Входные данные (CSV).
6 92121
3 93237
2 93828
2 95409
4 95439
3 101045
3 102515
2 105211
где сначала мы видим количество сбоев, а затем время с удаленными отметками :. Это заставляет GNUPlot видеть «время» как целое число.
Когда приведенный выше диапазон отображен на графике, мы видим следующее (обрезано для фокуса):
Глядя на диаграмму, я думаю, что знаки + следует сместить немного вправо, поскольку они не совпадают с тем местом, где, по моему мнению, они должны быть. 4 незначительных тика от 80 000 будут 90 000, а еще два тика вправо будут 95 000. Моя следующая точка данных находится на отметке 95 409, которая, как я ожидаю, будет ближе к 100 000, чем кажется.
Возможно, это интеллектуальная игра, потому что я рисую время, основанное на 60 единицах, на графике, основанном на десяти единицах. Формат ЧЧ:ММ:СС. 100000 — это 10:00:00, и хотя существует 10:50:27 (105027 в GNUPlot), мы не увидим 10:75:13 (107513) из-за переноса времени на 60 минут. Интересно, можно ли сказать GNUPlot, что ось X ориентирована во времени таким образом...
Второй вопрос заключается в том, как явно указать GNUPlot помечать каждый такт X, уменьшая интерпретируемое предположение значений X.
Вот моя команда GNUPlot:
gnuplot <<-EOFMarker
set datafile separator ','
set title "Devices failing pings at given time - Graph Created: UTC "
set xlabel 'Time in HH:MM:SS -- 6am run missing leading zero'
set ylabel 'Amount of Sites with Dropped Pings'
set yrange [1:75]
set grid
set key off
set xtics rotate
set mxtics 8
set terminal png size 4000,700
set output '/BigPing/Reports/${reporttime}-${checkhour}-sites-time.png'
plot '/mnt/ram/graph-input.dat' using 2:1
EOFMarker
Первоначально у меня были линии, соединяющие точки +, чтобы улучшить читаемость, но график не возвращался к нулю, как я, хотя это происходило, когда у нас не было данных.
Я ожидал большего количества ярлыков xtick, чтобы пробелы не были такими большими.
Вообще-то я обязательно буду использовать gnuplot 4.6.2.
Привет. Да, 110507 будет правильным: 11 часов 05 минут 07 секунд.
Конечно, gnuplot может отображать данные времени (проверьте help timecolumn
и help time_specifiers
), однако ваш формат данных времени немного неудачен. Например, gnuplot будет сложно решить, будет ли 12345
1h 23 m 45 s
или 12 h 34 m 5 s
. Следовательно, вы должны убедиться, что число состоит из 6 цифр, то есть с ведущим нулем. Вы можете принудительно сделать это через sprintf("%06d",...)
.
Затем вы можете легко декодировать это время с помощью строки спецификатора "%H%M%S"
.
Скрипт: (работает для gnuplot>=5.0.0, январь 2015 г.)
### plot special time format
reset session
$Data <<EOD
6 92121
3 93237
2 93828
2 95409
4 95439
3 101045
3 102515
2 105211
EOD
t(col) = strptime("%H%M%S", sprintf("%06d",column(col)))
set format x "%H:%M" timedate
set offset graph 0.05, 0.05, 0.05, 0.05
set grid x,y
set key noautotitle
plot $Data u (t(2)):1 w p pt 7 lc "red"
### end of script
Результат:
Дополнение: версия для gnuplot>=4.6.0, вывод такой же, как на графике выше.
Данные: SO78770582.dat
6 92121
3 93237
2 93828
2 95409
4 95439
3 101045
3 102515
2 105211
Скрипт: (работает как минимум для gnuplot>=4.6.0, март 2012 г.)
### plot special time format
reset
FILE = "SO78770582.dat"
t(col) = strptime("%H%M%S", sprintf("%06d",column(col)))
set xdata time
set format x "%H:%M"
set offset graph 0.05, 0.05, 0.05, 0.05
set grid x,y
set key noautotitle
plot FILE u (t(2)):1 w p pt 7 lc rgb "red"
### end of script
Спасибо за предложение кода! Я изменил свой код и получаю строку 0: ';' ожидаемая строка 0: ошибка символа неправильного формата. Похоже, у меня какая-то синтаксическая ошибка, поскольку это напоминает мне о моих днях на C++. Я запускаю это внутри сценария BASH. Я проверю руководство GNUPLOT на наличие подсказок по синтаксису.
Я также использую Gunplot 4.6 уровня патча 2.
@CyberdocWI Ой! gnuplot 4.6.2 уже более 10 лет. Не можете обновиться на более новую версию? gnuplot теперь имеет версию 6.0.
Сервер под управлением CentOS 7.9 находится в 1000 милях от меня и имеет строгие ограничения на подключение. Я собираюсь «экспортировать» файл .dat и попробовать его на чем-то гораздо более современном. Спасибо, что вернулись.
@CyberdocWI вижу добавленную версию для gnuplot 4.6.0
Спасибо за обновленный код! Он работает чисто, но графические данные не генерируются — размер png нулевого размера. Я собираюсь попытаться запустить сеанс XWindow, чтобы посмотреть, смогу ли я увидеть график без преобразования PNG. У меня есть другой сценарий GNUPLOT, который дает мне правильный график, поэтому я достаточно уверен, что базовая система находится в хорошей форме. Я проверил, что входной файл не пуст.
Запускаю в X Windows - получаю кратенькое окошко с данными! Затем оно исчезает. Мне пришлось снять фильм с экрана, чтобы заморозить его, но да, данные есть. Мы определенно на правильном пути!
Еще один извлеченный урок: важен порядок операторов между GNUPLOT и EOF. У меня был оператор графика перед оператором вывода, что привело к созданию пустого файла и экспорту двоичных символов на терминал.
Отлично получилось с файлом .plt
, инкапсулирующим данные в heredoc. Хороший трюк.
@CyberdocWI, если ваш терминал записывает в файл, вам следует добавить set output
в конце скрипта, чтобы фактически записать и закрыть файл.
С огромной благодарностью @theozh мне удалось собрать подходящий код для моего случая. Я благодарен за подсказки. Я удалил некоторые материалы внутри цитат, чтобы избежать переноса.
gnuplot <<-EOFMarker
set datafile separator ','
set terminal png size 2000,500
set title "Pings at given time - Graph Created: UTC "
set xlabel 'Time in HH:MM''
set ylabel 'Amount of Sites with Dropped Pings'
t(col) = strptime("%H%M%S", sprintf("%06d",column(col)))
set xdata time
set format x "%H:%M"
set offset graph 0, 0, 0, 0.05
set grid x,y
set key noautotitle
set output '/BigPing/Reports/${v1}-${v2}-sites-time.png'
plot '/mnt/ram/graph-input.dat' u (t(2)):1 w p pt 7 lc rgb "red"
EOFMarker
Добро пожаловать в StackOverflow! Пожалуйста, указывайте данные в виде текста, а не изображения. Вы упомянули, что время в вашем файле просто не содержит
:
, то есть ЧЧММСС. Это будет означать, что, например. 11:05:07 будет 110507, а не 1157, верно?