【发布时间】:2012-10-31 12:27:16
【问题描述】:
我在我的 ~/.bash_profile 中编写了以下过滤器作为函数:
hilite() {
export REGEX_SED=$(echo $1 | sed "s/[|()]/\\\&/g")
while read line
do
echo $line | egrep "$1" | sed "s/$REGEX_SED/\x1b[7m&\x1b[0m/g"
done
exit 0
}
查找与正则表达式匹配的任何内容的行,并在兼容 VT100 的终端上使用 ANSI 转义码突出显示匹配项。
例如,以下查找并突出显示字符串 bin、U 或 1,它们是 / 的最后 10 行中的整个单词等/密码:
tail /etc/passwd | hilite "\b(bin|[U1])\b"
但是,脚本运行非常缓慢,因为每一行都分叉了一个 echo、egrep 和 sed。
在这种情况下,对整个输入执行 egrep,然后在其输出上运行 sed 会更有效。
如何修改我的函数来做到这一点?如果可能,我宁愿不创建任何临时文件。
附:有没有其他方法可以以类似的方式查找和突出显示线条?
【问题讨论】:
-
exit 0可能不是您想要的。如果您无意中输入了tail file; hilite foo,您的shell 将终止!使用:、true、return 0,或者完全删除exit 0这一行。 -
@WilliamPursell:你说得对,谢谢!猜猜stackoverflow.com/questions/5104426/while-loop-in-bash-script 也应该修复...
标签: bash shell filter highlighting grep