我一直在一些logcat输出上使用grep
和sed
,以使其更具可读性,我注意到我的输出明显比仅使用grep
输出慢。
我知道sed显然会增加更多的运行时,但我想检查一下是否有任何优化技术。
我的命令看起来像这样以供参考:
adb logcat | grep arg | sed $'s/{/\n{/g
无用的grep
有很好的文档记录,很容易清除。
adb logcat | sed $'/\*arg/s/{/\n{/g'
为了简单地重申链接的网页,任何看起来像grep 'x' | sed 'y'
的内容都可以重构为sed '/x/y'
(类似地,grep 'x' | awk 'y'
可以简化为awk '/x/ y'
(。sed
和Awk都是通用的regex工具,可以完成grep
所能做的一切(尽管公平地说,一些复杂的grep
选项在sed
或Awk脚本中重新实现是乏味的;但这显然不是其中之一(。
然而,*arg*
不是一个定义良好的正则表达式;所以我得猜一猜你到底是什么意思。
*
定义不明确;但是许多CCD_ 16实现将其理解为字面上的星号。如果这不是你的意思,也许可以去掉第一个\*
g
字符,请不要指定它们。但也许你的意思是arg
后面跟着什么arg
(隐含地在前面和后面有任何内容(如果还不清楚,*
在正则表达式中不是通配符。相反,它说尽可能多次重复前面的表达式,为零或更多(因此regex中说"任何字符串"的方式是.*
,即"任何字符(换行符除外(";通配符.
重复零次或多次(。
此外,grep
(以及sed
和Awk(在一行中的任何位置查找正则表达式(除非您放入显式正则表达式锚点或使用grep -x
或sed
或Awk中的等效选项(,因此您不需要指定";前面有任何";或";后面跟着任何东西";。
The Bash";C样式字符串";$'...'
提供了一些便利,但也要求任何文字反斜杠都要加倍。所以$'/\*/'
等价于普通单引号中的'/*/'
。
sed
减慢速度的原因可能是缓冲,但去掉无用的grep
也恰好去掉了缓冲。