如何忽略前面的管道符号?

问题描述 投票:0回答:3

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

在下面的示例中,我需要忽略管道和空格,因为我使用的是 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
regex bash shell awk grep
3个回答
2
投票

不要尝试使两行中的每一行都具有相同数量的字段,只需使用 grep 的

-o
选项仅匹配与正则表达式匹配的行的一部分。那么你就根本不需要
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}'

2
投票

一切都在

awk
中完成:

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

请参阅 @CodeGnome 的版本以获取更精确的正则表达式。


1
投票

您可能应该调整您的命令以减少正则表达式匹配器的麻烦。然而,您当然可以使用 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 或其他一些机制拆分这两个字段,然后再将其输入到脚本中的下一步。

© www.soinside.com 2019 - 2024. All rights reserved.