Для этого решения требуется GNU awk
:
NR == FNR {
split($6, arr, "-");
date = mktime(sprintf("%4d %02d %02d 00 00 00", arr[1], arr[2], arr[3]));
if (!start[$5] || date < start[$5]) {
start[$5] = date;
}
if (date > stop[$5]) {
stop[$5] = date;
}
next;
}
{
print $0 " " int((stop[$5] - start[$5]) / (3600 * 24));
}
Для последовательных устройств вы должны найти их имена по топологии в /dev/serial/by-path/
, поэтому, если вы используете те же концентраторы USB и порты, они должны оставаться постоянными. Например:
ls -l /dev/serial/by-path/pci-0000:04:00.0-usb-0:2.1.1:1.0-port0
... /dev/serial/by-path/pci-0000:04:00.0-usb-0:2.1.1:1.0-port0 ->../../ttyUSB0
Точно так же вы должны найти устройства по имени, иногда включая серийный номер, в разделе /dev/serial/by-id/
, например:
ls -l /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A5771WOA-if00-port0
... /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A5771WOA-if00-port0 ->../../ttyUSB0
Для этого можно использовать правила udev. Правило udev может сопоставлять USB-устройство по его серийному номеру и позволяет создать альтернативное имя для устройства в /dev
.
Подобного правила udev должно быть достаточно для создания символической ссылки в /dev
, указывающей на реальный узел устройства:
SUBSYSTEM=="usb", ATTRS{serial}=="<serial number>", SYMLINK+="USBserial1"
Подробнее см. Написание правил udev Дэниела Дрейка.