Если имя устройства заканчивается цифрой, то ядро добавляет символ 'p', чтобы отделить номер раздела от имени устройства.
/dev/sda -> /dev/sda1
/dev/mmcblk0 -> /dev/mmcblk0p1
Подробнее см. disk_name
функция в исходных кодах ядра Linux (linux/block/partition -generic.c):
if (isdigit(hd->disk_name[strlen(hd->disk_name)-1]))
snprintf(buf, BDEVNAME_SIZE, "%sp%d", hd->disk_name, partno);
else
snprintf(buf, BDEVNAME_SIZE, "%s%d", hd->disk_name, partno)
Взяв ваш скрипт, я добавил один канал черезxargs
(передawk
)a, чтобы подавить вывод ошибок, а затем просто использовал paste
, чтобы получить желаемый формат:
#!/bin/bash
for i in ` systemctl list-unit-files | grep enabled | awk '{print $1}' `
do
echo -e $i
systemctl status $i | grep "Active:" | xargs | awk -F";" '{print (NF>1)? $NF : ""}'
done | paste -d, - -
Обновление с использованием формата «до X дней» в качестве вывода. Это проверяет статус, и если статус соответствует регулярному выражению даты (, какие мертвые или неактивные службы или другие ошибки не будут иметь ), он вычислит разницу дат. Основан на пакетеdateutils
-, доступном для большинства дистрибутивов. Обратите внимание, что моя команда использует способ вызова debian
dateutils
-, который может различаться в разных дистрибутивах. «Хак» xargs
здесь не нужен из-за sed
и условного изменения $status
.
#!/bin/bash
for i in ` systemctl list-unit-files | grep enabled | awk '{print $1}' `
do
echo $i
dateregex='20[0-9][0-9]-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]'
status=$(systemctl status $i | grep "Active:" | sed "s/.*\($dateregex\).*/\1/")
if [[ "$status" =~ $dateregex ]] ; then
status=$(dateutils.ddiff -f "up %d days" "$status" now)
fi
echo "$status"
done | paste -d, - -
Выход:
syslog.service,up 82 days
systemd-fsck-root.service,up 82 days
systemd-timesyncd.service,up 13 days
triggerhappy.service,up 82 days
wpa_supplicant.service,up 82 days
Вы можете получить требуемый результат, добавив команду sed
#!/bin/bash
for i in ` systemctl list-unit-files | grep enabled | awk '{print $1}' `
do
echo -e $i
systemctl status $i | grep "Active:" | xargs | awk -F";" '{print (NF>1)? $NF : ""}'
done |sed "N;s/\n/ /g"