#bash #scripting
#bash #сценарии
Вопрос:
Мне нужно проанализировать вывод команды mmls и сохранить несколько значений в переменных с помощью скрипта BASH.
В частности, мне нужно сохранить: размер сектора (512 в примере ниже) и начальные значения (0,0,63,224910,240975 в примере ниже). Поскольку второй набор значений представляет разделы, количество захваченных значений может варьироваться.
mmls /mnt/E01Mnt/RAW/ewf1
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors
Slot Start End Length Description
000: Meta 0000000000 0000000000 0000000001 Primary Table (#0)
001: ------- 0000000000 0000000062 0000000063 Unallocated
002: 000:000 0000000063 0000224909 0000224847 NTFS / exFAT (0x07)
003: 000:001 0000224910 0000240974 0000016065 DOS FAT12 (0x01)
004: ------- 0000240975 0000250878 0000009904 Unallocated
Комментарии:
1. Добро пожаловать в SO. Stack Overflow — это страница вопросов и ответов для профессиональных и увлеченных программистов. Добавьте свой собственный код к вашему вопросу. Ожидается, что вы покажете, по крайней мере, объем исследований, которые вы провели для самостоятельного решения этого вопроса.
Ответ №1:
Вот начало:
$ awk '/^Units/{print $4 0} /^[0-9]/{print $3 0}' file
512
0
0
63
224910
240975
Попробуйте решить остальное самостоятельно, а затем дайте нам знать, если у вас есть вопросы.
Объяснение: file
это файл, содержащий ваш образец ввода. Вы можете заменить awk '{script}' file
на command | awk '{script}'
, если ваш ввод поступает из вывода какой-либо команды, а не сохраняется в файле.
^
является универсальным метасимволом start of string
регулярного выражения, в то время /.../
как в awk означает «найти это регулярное выражение». Итак, вышесказанное ищет строки, которые начинаются с отображаемого текста (т.Е. Units
Или Цифр), а Затем печатает 4-е или 3-е разделенное пробелом поле после добавления к нему нуля, чтобы удалить любые конечные не цифры или начальные нули. man awk
.
Комментарии:
1. Привет, спасибо за ответ. Не могли бы вы предоставить базовое объяснение того, что вы здесь делаете? Для чего нужен «/^»? Как насчет 4 долларов? Кроме того, что такое «файл» в вашем коде?
2. Я добавил объяснение к своему ответу.
Ответ №2:
awk
Для начала вам нужно немного.
values=( $(mmls /mnt/E01Mnt/RAW/ewf1 | awk '
/^Units are in/{match($4,/^[[:digit:]] /,ss); print ss[0]}
NR>6{print $4}'
) )
Теперь у вас есть массив значений, который содержит как размер сектора (первый элемент), так и начальные значения (последующие элементы). Мы могли бы выполнить некоторые манипуляции с массивом для разделения отдельных элементов.
secsize=${values[0]} # size of sector
declare -a sv # sv for start values
for((i=1;i<${#values[@]};i ))
do
sv =( ${values[i]} )
done
echo "${sv[@]}" # print start values
unset values # You don't need values anymore.
Примечание: требуется GNU awk.