Анализировать вывод команды и сохранять в переменных

#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.