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

时间:2012-07-13 14:45:35

标签: regex bash shell awk grep

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

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

实际命令给了我

cmd

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

3 个答案:

答案 0 :(得分:1)

不要试图让两行中的每一行具有相同数量的字段,而只需使用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}'

答案 1 :(得分:1)

awk中完成所有操作:

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

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

答案 2 :(得分: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或其他一些机制拆分这两个字段,然后再将其提供给脚本中的下一步。