2012-07-13 62 views
-2

如何忽略正则表达式中行的起始斜杠和空格?如何忽略前面的管道符号?

在下面的例子中,我需要忽略管道和空间,因为我用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

你的例子中没有斜线。 – 2012-07-13 14:47:24

+0

对不起,是'|'不是斜线......我不知道它是什么...... – howtechstuffworks 2012-07-13 14:49:12

+0

好吧,我没有使用工作管道,因为它可能会混淆..... – howtechstuffworks 2012-07-13 14:50:34

回答

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}' 
+0

实际上我需要其他信息也行.......就像磁盘名称sdh/sdl等等。 ... – howtechstuffworks 2012-07-13 14:52:57

+5

@howtechstuffworks,这就是为什么我们需要知道你期待什么作为输出。 – kojiro 2012-07-13 14:53:48

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,或一些其他机制再拆两个字段。

1

把一切都awk

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

见@ CodeGnome的版本,下面更精确的正则表达式。

+0

+1。我喜欢你的解决方案,但我会加'awk --re-interval'/([[:digit:]]:){3,} [[:digit:]]/{sub(“\\ |”, “”);打印$ 2,$ 3}“作为gawk的替代品,因为它更具表现力。 – 2012-07-13 15:28:15

+0

啊,最好忘记量词,将它添加到我的例子中。 – Thor 2012-07-13 15:29:52