解析命令输出并存储在变量中

时间:2019-04-20 17:19:50

标签: bash scripting

我需要解析 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

2 个答案:

答案 0 :(得分: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 :(得分:0)

首先需要一点awk

values=( $(mmls /mnt/E01Mnt/RAW/ewf1 | awk '
/^Units are in/{match($4,/^[[:digit:]]+/,ss); print ss[0]}
NR>6{print $4}'
) )

现在您有了一个values数组,其中包含扇区大小(第一个元素)和起始值(后续元素)。我们可以进行一些数组操作来分离单个元素。

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。