Получить серийный номер из Show inventory [closed]

badblocks является частью e2fsprogs , исходный код которого находится в этом репозитории git . В частности, вы найдете badblocks.c в папке misc . comm_err.h находится в lib / et .

1
24.02.2017, 17:17
3 ответа

Использование 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 ) и выполняет ту же замену, что и раньше, только в этой строке. Это даст вам серийный номер.

Затем он также печатает последнюю строку ввода.

2
27.01.2020, 23:19

Использовать пустые строки в качестве разделителя записей.

Если строка соответствует «1», сохранить последнее поле.

Распечатать последнюю строку без последнего символа и распечатать сохраненное поле.

awk 'BEGIN {RS = ""}
     { if ($0 ~/ "1", /) { serial=$NF } }
     END { print substr($0, 1, length($0)-1) ; print "SN: " serial }' file
1
27.01.2020, 23:19
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.

1
27.01.2020, 23:19

Теги

Похожие вопросы