我正在尝试让每个grep命令以不同的颜色突出显示它的结果。我可以用这样的一行手动进行操作:
ls -l GREP_COLORS='mt=01;32' grep c | GREP_COLORS='mt=01;31' grep o | GREP_COLORS='mt=01;34' grep n | GREP_COLORS='mt=01;36' grep f
每个c
字符将以绿色突出显示,每个o
字符将以红色突出显示,等等。
为了使该示例正常工作,您需要确保始终使用
--color=always
grep命令。我已经在我的.bashrc
grep中设置了它,所以它将始终具有颜色:
export GREP_OPTIONS='--color=always'
我要完成的工作是用别名包装此功能,这样我每次grep
都可以调用并具有不同的GREP_COLORS
值。我了解为每个新的管道grep考虑多个外壳的问题,并且我试图通过创建一些文件(每种颜色一个)来解决这个问题,以表明它们已被使用。
我做了一些尝试,但奇怪的是,这似乎是“最好的”方法。我在我的.bashrc
:
alias mg="mygrep"
mygrep(){
# define possible colors
COLORS=("01;32" "01;31" "01;34" "01;36")
COUNTER=0
NUM=0
# as long as the color has already been used, keep searching
while [ -f /home/lior/Desktop/mygrep_$NUM ]; do
# get a random index
let NUM=`shuf --input-range=0-$(( ${#COLORS[*]} - 1 )) | head -1`
wait ${!}
$(( COUNTER+=1 ))
if [ "$COUNTER" -ge ${#COLORS[@]} ]; then
# remove all color locks
rm /home/lior/Desktop/mygrep_*
wait ${!}
fi
done
# mark this color as used
touch /home/lior/Desktop/mygrep_$NUM
wait ${!}
# lets go!
GREP_COLORS="mt=${COLORS[$NUM]}" grep "$@"
}
我使用这样的别名:
ll | mg c | mg o | mg n | mg f
结果很酷。但是,有些错误每次都会稍有不同。这是几个屏幕截图:
看起来像Shell在执行每个pipe命令时一样,先前的函数尚未完成其执行。它尝试删除不再存在的文件。我不太确定这些其他command not found
错误来自何处。
如您所见,我已经输入了一些wait
命令来尝试完成文件操作,但这似乎不太正常。我已经尝试过的另一件事是使用共享内存,/dev/shm
但是它产生了相似的结果。
我将如何获得想要的结果?
注意:
我正在寻找简单地包装grep命令的答案,因为它具有许多我想使用的功能,并且打算在管道之间插入其他逻辑,因此我不想一次提供所有搜索词。我也没有在寻找其他“类似grep”的工具。对不起@terdon,他已经发布了一个很棒的perl建议。
alias mg="mygrep; grep"
吗?
mygrep;
本身变成了一个新命令,并且数据流丢失了。从传入的管道ls
将传递mygrep;
给grep而不是grep。至少我是这样理解的。
--color=always
所有grep命令上都有。我已将其全局设置在.bashrc
。我已将其编辑到帖子中。