问题描述
我一直在一些 logcat 输出上使用 grep
和 sed
以使其更具可读性,我注意到我的输出明显比 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
也巧合地摆脱了缓冲。