【问题标题】:How do I ignore a pipe symbol at the front?如何忽略前面的管道符号?
【发布时间】:2012-07-13 14:45:34
【问题描述】:

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

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


【解决方案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}'

【讨论】:

  • 实际上我还需要该行中的其他信息.......比如磁盘名称sdh/sdl等......
  • @howtechstuffworks 这就是为什么我们需要知道您期望的输出。
【解决方案2】:

一切尽在awk

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

查看下面的@CodeGnome 版本以获得更精确的正则表达式。

【讨论】:

  • +1。我喜欢您的解决方案,但我会添加 awk --re-interval '/([[:digit:]]:){3,}[[:digit:]]/ { sub("\\|", ""); print $2, $3 }' 作为笨拙的替代方案,因为它更具表现力。
  • 嗯更好,忘了量词,将其添加到我的示例中。
【解决方案3】:

您可能应该调整您的命令以减少正则表达式匹配器的繁琐。但是,您当然可以使用与 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 或其他一些机制拆分这两个字段,然后再将其提供给脚本的下一步。

【讨论】:

    猜你喜欢
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多