在 logcat 上优化 sed

问题描述

我一直在一些 logcat 输出上使用 grepsed 以使其更具可读性,我注意到我的输出明显比 grep 输出慢。>

我知道 sed 显然会增加更多的运行时间,但我想检查是否有任何优化技术。

我的命令看起来像这样以供参考:

adb logcat | grep arg | sed $'s/{/\\\n{/g

解决方法

useless grep 有据可查且易于删除。

adb logcat | sed $'/\\*arg/s/{/\\\n{/g'

简单地重申链接的网页,任何看起来像 grep 'x' | sed 'y' 的东西都可以重构为 sed '/x/y'(对于 grep 'x' | awk 'y' 也是如此,它简化为 awk '/x/ y')。 sed 和 Awk 都是通用的正则表达式工具,可以完成 grep 可以做的所有事情(尽管公平地说,一些复杂的 grep 选项在 sed 或 Awk 脚本中重新实现很乏味;但这显然不是这些情况之一)。

然而,*arg* 不是一个定义明确的正则表达式;所以我得猜你的意思。

    正则表达式开头的
  • * 没有明确定义;但许多 grep 实现会将其理解为字面的星号。如果这不是您的意思,请去掉第一个 \\*
  • arg* 完全等同于 ar;如果您不在乎匹配后是否有 g 个字符,则不要指定它们。但也许您的意思是 arg 后跟任何东西?
  • 但我猜你的意思可能只是 arg(隐式前面和后面是任何东西)。

如果不是很明显,* 不是正则表达式中的通配符。相反,它说尽可能多地重复前面的表达式,零次或多次(因此在正则表达式中说“任何字符串”的方式是.*,即“任何字符(换行符除外)”通配符 . 重复零次或多次)。

此外,grep(以及 sed 和 Awk)会在一行中的任何位置查找正则表达式(除非您放置了显式正则表达式锚点或使用 grep -x 或 {{ 1}} 或 Awk),因此您无需指定“前面有任何内容”或“后面有任何内容”。

Bash“C 样式字符串”sed 提供了一些便利,但也需要将任何文字反斜杠加倍。所以 $'...' 等价于常规单引号中的 $'/\\*/'

'/\*/' 减慢您速度的原因可能是 buffering,,但摆脱无用的 sed 也巧合地摆脱了缓冲。