badblocks
является частью e2fsprogs
, исходный код которого находится в этом репозитории git . В частности, вы найдете badblocks.c
в папке misc
. comm_err.h
находится в lib / et
.
Использование GNU sed
:
$ show inventory | sed -n '/^NAME: "1"/,+1s/^.*, //p'
DESCR: "WS-C3750G-12S"
SN: FDO1129Z9ZJ
Сценарий редактирования sed
будет искать строки, начинающиеся с NAME "1"
, и применяет замену к этим строкам и первая сразу после строки.
Замена удалит все в строках до последней запятой включительно (и пробел сразу после нее). Полученные строки выводятся на терминал.
Если вам нужен только серийный номер и последняя строка вывода:
$ show inventory | sed -n -e '/^NAME: "1"/{n;s/^.*, //p}' -e '$p'
SN: FDO1129Z9ZJ
Barragan_3750>
Здесь сценарий sed
находит строку, как и раньше, но сразу же читает следующую строку (с n
) и выполняет ту же замену, что и раньше, только в этой строке. Это даст вам серийный номер.
Затем он также печатает последнюю строку ввода.
Использовать пустые строки в качестве разделителя записей.
Если строка соответствует «1», сохранить последнее поле.
Распечатать последнюю строку без последнего символа и распечатать сохраненное поле.
awk 'BEGIN {RS = ""}
{ if ($0 ~/ "1", /) { serial=$NF } }
END { print substr($0, 1, length($0)-1) ; print "SN: " serial }' file
show inventory | perl -l -00ane '
/^NAME:\s+"1",/m and $serial_num = "@F[-2,-1]";
print substr($_,0,-1), $\, $serial_num if eof;
'
Краткое резюме:
Для начала приведены используемые опции Perl
.
Мы используем Perl в режиме абзаца
-00
, а также в режиме авторазбивки -a
, при котором каждый абзац разбивается на пробелы для заполнения массива @F
каждый раз, когда читается новый абзац.
Вот как выглядит Perl'овский $_
после проглатывания одного параграфа:
NAME: "1", DESCR: "WS-C3750G-12S"
PID: WS-C3750G-12S-E , VID: V06, SN: FDO1129Z9ZJ
IOW, $_
удерживает параграф. Затем этот $_
разбивается на \s+
следующим образом:
@F = split /\s+/, $_;
.
В результате получается массив @F
, излагаемый в обратном порядке:
$F[-1] = 'FDO1129Z9ZJ'; $F[-2] = 'SN:' ...
И заметьте, все вышеперечисленное происходит под капотом
. Когда с этим разобрались, переходим к коду фрагмента Perl:
/^NAME:\s+"
",/m => вернет true для записи aka para aka $_
, если она начинается с NAME...
или начинается с NAME. ...
на новой строке
из-за модификатора шаблона /m
, обозначающего для многострочного соответствия
. Для этого мы получаем серийный номер как последнее поле $F[-1]
этого пункта и берем строку SN:
как второе последнее поле $F[-2]
. Теперь мы можем извлечь их одним махом, например @F[-2,-1]
, и поместить их под двойные кавычки, например "@F[-2,-1]"
, подразумевая "$F[-2]" пробел "$F[-1]"
что-то вроде знаменитой shell-переменной "$@"
. То есть мы получаем список элементов массива, разделенных пробелами. Если быть точным, это суперглобальная $"
, значение которой выступает в качестве разделителя, точно так же, как первый символ в IFS
определяет интерполяцию двойных кавычек "$*"
в bash
.
Теперь у нас есть серийный номер
устройства, идем искать номер устройства
, который находится на последней записи
aka eof
. Здесь substr($_,0, -1)
берет $_
aka para
и удаляет 1
char, начиная с конца -1
, что и обозначает -
означает и возвращает после удаления и конкатенирует серийный_номер
уже определенный с $\
, который набит \n
из-за опции -l
. В итоге это выводится в stdout.
Надеюсь, я не был очень запутанным и HTH.