2012-10-31 46 views
0

我寫了下面的過濾器的功能在命令我在〜/ .bash_profile:加快bash的過濾功能,以連續運行,而不是每行

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轉義碼突出顯示匹配項。

例如,以下的發現,並突出琴絃ü或這是在最後10行的整個單詞/ etc/passwd中:

tail /etc/passwd | hilite "\b(bin|[U1])\b" 

然而,腳本運行速度非常緩慢,因爲每行都會分叉echo,egrep和sed。

在這種情況下,這將是更有效地做的egrep對整個輸入,然後在其輸出端運行的sed。

如何修改我的函數來做到這一點?如果可能,我寧願不創建任何臨時文件。

P.S.是否有另一種方式來以類似的方式查找和突出顯示線條?

+2

'退出0'可能不是你想要的。如果你不小心輸入了尾部文件; hilite foo',你的shell將終止!使用':','真','返回0',或者只是刪除'出口0'線完全。 –

+0

@WilliamPursell:你說得對,謝謝!猜測http://stackoverflow.com/questions/5104426/while-loop-in-bash-script也應該修正... – Gnubie

回答

2

sed可以做一些自己的grepping:如果你給它-n標誌(或腳本中的#n指令),它不會迴應任何輸出,除非詢問。所以

while read line 
do 
    echo $line | egrep "$1" | sed "s/$REGEX_SED/\x1b[7m&\x1b[0m/g" 
done 

可以簡化爲

sed -n "s/$REGEX_SED/\x1b[7m&\x1b[0m/gp" 

編輯: 這裏的整體功能:

hilite() { 
    REGEX_SED=$(echo $1 | sed "s/[|()]/\\\&/g"); 
    sed -n "s/$REGEX_SED/\x1b[7m&\x1b[0m/gp" 
} 

這一切就是這麼簡單 - 沒有while循環,閱讀,grepping等。

+1

不,不需要egrep的。使用'-n'和'p'標誌的全部意思是不打印任何東西,除非它匹配。這與grep完全一樣。 'sed -n'/ foo/p''只是寫'grep foo'的另一種方法。 –

1

嗯,你可以簡單地這樣做:

egrep "$1" $line | sed "s/$REGEX_SED/\x1b[7m&\x1b[0m/g" 

但我不知道它會快很多; )

+1

我不知道,但'回聲'可能比'egrep更輕'和'sed'。反正不會'egrep'治療'$ line'作爲一個文件來在你寫的命令行解析? – doubleDown

+0

對不起,語法是egrep的作爲doubleDown評論。 – Gnubie

+0

是的,你是對的,我誤解了原來的問題... – tamasgal

2

我認爲你可以簡單地

sed -n "s/$REGEX_SED/\x1b[7m&\x1b[0m/gp" 

因爲sed可以從標準輸入讀取更換整個while環行由行,所以你不需要read

我不知道如果運行egrep和管道到sed比單獨使用sed更快,但你總是可以比較使用time

編輯:添加-npsed僅打印突出顯示的行。

+0

修正了簡單地使用'-n'選項並設置's'命令的'p'標誌 – doubleDown

2

如果您egrep支持--color,只是把這個中的.bash_profile:

hilite() { command egrep --color=auto "[email protected]"; } 

(就個人而言,我會命名功能egrep;因此的command使用)。

+0

儘管我更喜歡反向視頻,那太棒了!也可以使用GREP_COLOR或GREP_COLORS更改顏色:http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html。對於單個命令:http://stackoverflow.com/questions/3420845/in-bash-how-to-write-alias-or-function-for-export-grep-color-132-grep-co。 – Gnubie

0

只是爲了記錄在案,這是使用臨時文件的方法:

hilite() { 
export REGEX_SED=$(echo $1 | sed "s/[|()]/\\\&/g") 
export FILE=$2 
if [ -z "$FILE" ] 
then 
    export FILE=~/tmp 
    echo -n > $FILE 
    while read line 
    do 
    echo $line >> $FILE 
    done 
fi 
egrep "$1" $FILE | sed "s/$REGEX_SED/\x1b[7m&\x1b[0m/g" 
return $? 
} 

這也需要一個文件/路徑名作爲第二個參數,對於像的情況下

cat /etc/passwd | hilite "\b(bin|[U1])\b"