正则表达式匹配Bash中MMLS命令的第二列

时间:2015-06-15 16:42:46

标签: regex

我正在编写一个脚本来匹配MMLS中的特定值(起始列)。

输出类似于:

#     Slot    Start        End          Length       Description
#00:  Meta    0000000000   0000000000   0000000001   Safety Table
#01:  -----   0000000000   0000002047   0000002048   Unallocated
#02:  Meta    0000000001   0000000001   0000000001   GPT Header
#03:  Meta    0000000002   0000000033   0000000032   Partition Table
#04:  00      0000002048   0001026047   0001024000   SYSTEM
#05:  01      0001026048   0001288191   0000262144   Microsoft reserved partition
#06:  02      0001288192   0625141759   0623853568   Windows
#07:  -----   0625141760   0625142447   0000000688   Unallocated   

作为正则表达式的新手,我现在的正则表达式看起来像:

 [^ ]+\s+[^](?=\s.*SYSTEM)

如果我只想匹配Start列什么是最好的方法,那么SYSTEM行的Slot,Start和End与尾随空格匹配?

约束:不会总是有7个插槽,尺寸会有所不同。

2 个答案:

答案 0 :(得分:1)

匹配所有start列(#3):

/^(?:\S+\s+){2}(\S+)/gm

仅在行上找到SYSTEM时匹配:

/^(?:\S+\s+){2}(\S+)(?=\s.*SYSTEM)/gm

RegEx Demo

更新:如果在Ubuntu中运行,您可以使用这样的简单awk:

awk '/SYSTEM/{print $3}' file
0000002048

答案 1 :(得分:1)

如果您只想使用awk

要打印任何i th ,您可以使用awk as:

来执行此操作
awk '{print $i}'

如果要选择包含PATTERN的特定行并打印其i th 列:

awk '/PATTERN/{print $i}'

在您的示例中:

完全打印start列:

awk '{print $3}'

输出:

Start
0000000000
0000000000
0000000001
0000000002
0000002048
0001026048
0001288192
0625141760

打印包含start的行的SYSTEM列值:

awk '/SYSTEM/{print $3}'

输出:

0000002048