Обект WMI Win32_Battery имеет много интересных свойств, одно из них - deviceId. Но ИБП от APC пихают в это поле всё подряд - от серийного номера до версий firmware.
Возникла задача: выделить только серийный номер, при этом остальные свойства, которые wmic возвращает в виде непрерывной строки, поля в которой разделяются вертикальной чертой (|) остались на месте.
В конце концов родилось вот такое:
wmicc.sh ИМЯ_КОМПА|tail -n +3 |sed -r "s/([0-9][A-Z][0-9]{4}[A-Z][0-9]{5})[^|]*/\1/g" |datamash transpose -t \| |column -t -s \|
wmicc.sh - это скрипт-обертка, передающий wmic-у вспомогательные параметры - авторизацию и т.п., а так же параметры отбора.
tail обрезает первые 2 строки, в которых содержится ненужный мне мусор.
datamash transpose преобразует последовательные строки в столбцы
column придает этим столбцам красивую ширину
А самое интересное делает sed. В поле deviceId текст выглядит примерно так:
1A2152Z12345 American Power ConversionBack-UPS XS 650CI FW:892.R2.I USB FW:R2
Первое алфавитно-цифровое сочетание и есть серийный номер ИБП, причем 2 цифры сразу после первой буквы (A21) - это год выпуска (пример серийника выше - условный, так что год в нём 2021). Но вот всё остальное до конца строки мне ни к чему.
Поля, как уже сказано, отделяются друг от друга вертикальной чертой, поэтому задача была оставить только серийник, убрав всё остальное до границы поля. Поэтому регэксп читается примерно так:
- найти сочетание вида ЦБЦЦЦЦБЦЦЦЦЦ (Ц - цифра, Б - буква), обозначить его как "группа 1"
- в той же строке сразу после этой группы искать любое количество любых символов кроме вертикальной черты
- заменить найденное в п.п.1 и 2 на то, что находится в "группа 1"
- Профит!
$ echo "1A2152Z12345 American Power ConversionBack-UPS XS 650CI FW:892.R2.I USB FW:R2|" |sed -r "s/([0-9][A-Z][0-9]{4}[A-Z][0-9]{5})[^|]*/\1/g"
1A2152Z12345|
Хитрость была в том, что я далеко не сразу понял, как именно указать, что нужно искать всё до ближайшего разделителя полей. Для выполнения таких подстановок ключ -r обязателен, иначе sed ругается.
Комментариев нет:
Отправить комментарий
Пожалуйста, воздержитесь от грубостей и персональных нападок.
Я не против матерщины, но она должна быть уместной и использоваться для выражения эмоций, а не в качестве основного средства выражения мыслей.