如何在正则表达式中忽略行开头的正斜杠和空格?
在下面的例子中,我需要忽略管道和空间,因为我使用的是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
答案 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或其他一些机制拆分这两个字段,然后再将其提供给脚本中的下一步。