-2

如何在正则表达式中忽略行首的正斜杠和空格?

在下面的示例中,我需要忽略管道和空格,因为我使用的是 grep 和 awk

实际的命令给了我

命令

size=5.0G features='0' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=1 status=active
| `- 3:0:0:3   sdh  8:112   active ready running    #Line 3
`-+- policy='round-robin 0' prio=1 status=enabled
  `- 4:0:0:3   sdl  8:176   active ready running    #Line 5

通过做这个:

cmd | grep -E '[0-9]+:[0-9]+:[0-9]+:[0-9]+' | awk '{print $3}'

我能够得到sdh,sdl。但问题是,我需要忽略“|” 预先,使第 3 行和第 5 行相同。请指教。

编辑 1 我需要获取两个信息

1) 编号

3:0:0:3
4:0:0:3

2) 磁盘名称

sdh
sdl
4

3 回答 3

1

不要试图让你的两行中的每一行都具有相同数量的字段,只需使用-ogrep 选项来仅匹配你的正则表达式的部分行。然后你根本不需要这个awk命令。

cmd | grep -o -E '[0-9]+:[0-9]+:[0-9]+:[0-9]+'

由于您实际上需要的不仅仅是原始问题中的内容:

cmd | grep -E '[0-9]+:[0-9]+:[0-9]+:[0-9]+' | sed 's/^| //' | awk '{print $2, $3}'
于 2012-07-13T14:51:30.627 回答
1

做这一切awk

gawk --re-interval '/[0-9:]{4}/ { sub("\\|", ""); print $2, $3 }'

有关更精确的正则表达式,请参阅下面的 @CodeGnome 版本。

于 2012-07-13T15:24:10.367 回答
0

您可能应该调整您的命令以减少正则表达式匹配器的麻烦。但是,您当然可以使用与 Perl 兼容的正则表达式来做到这一点。例如:

$ pcregrep -o '((\d:){3}\d)\s+\S+' << 'EOF'
size=5.0G features='0' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=1 status=active
| `- 3:0:0:3   sdh  8:112   active ready running    #Line 3
`-+- policy='round-robin 0' prio=1 status=enabled
  `- 4:0:0:3   sdl  8:176   active ready running    #Line 5
EOF

3:0:0:3   sdh
4:0:0:3   sdl

然后,您可以使用 IFS、awk 或其他一些机制拆分这两个字段,然后再将其提供给脚本的下一步。

于 2012-07-13T15:23:52.137 回答