Posted on 2010-06-07 12:25
Prayer 閱讀(2629)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Shell 、
PERL
shell文本處理方面,主要是有sed,awk這兩把刀。
光給你個(gè)shell你進(jìn)行文本處理是做不到的,當(dāng)然簡(jiǎn)單的還可以。
perl里有正則表達(dá)式引擎,能針對(duì)文本進(jìn)行拆分替換等復(fù)雜操作,關(guān)鍵是,perl不用fork出新的進(jìn)程來(lái)處理這些事情,而shell需要使用管道等通過(guò)這些sed,awk的進(jìn)程來(lái)處理,至少就多出部分進(jìn)程的開(kāi)銷。
而且,管道這個(gè)東西,原本一個(gè)工具一次能完成的任務(wù),在需要經(jīng)過(guò)sed,和awk等多次管道。效率可想而知。
其實(shí)你這個(gè)問(wèn)題問(wèn)的有點(diǎn)弱智,SHELL是什么?
SHELL只是一個(gè)接口,大部分的功能全靠外部程序來(lái)完成。 而Perl是一種語(yǔ)言,基本上什么事情都能做。 |
老老實(shí)實(shí)學(xué)好一樣?xùn)|西最實(shí)際。
當(dāng)你參加面試的時(shí)候,如果可以自信的說(shuō)自己熟練使用Shell或者Perl,那就相當(dāng)不錯(cuò)了。
效率之類的云云,具體問(wèn)題具體分析吧,能解決工作中遇到的問(wèn)題就行。
看出來(lái)樓主比較關(guān)心文本處理,下面這個(gè)比方不一定恰當(dāng),但已經(jīng)很接近了:
- 相比較而言,awk、sed就像死板手,而perl和python是個(gè)活板手。
- awk和sed專注于文本處理,大部分情況效率要優(yōu)于perl等。很簡(jiǎn)單,比如列文件,誰(shuí)能有cat的效率高?
- 如果你是個(gè)懶惰的SA,那就用shell吧。如果是geek或者你的工作需要復(fù)雜的邏輯,并且還會(huì)出現(xiàn)許多無(wú)法預(yù)知的新要求,那就用perl等好了。
|
沒(méi)那么多關(guān)鍵字,是打字手誤,但是1-10萬(wàn)數(shù)量級(jí)的關(guān)鍵字,在千萬(wàn)行級(jí)文本文件中搜索,這個(gè)量還是有的。
來(lái)段sed multiple keywords search in batch的代碼,歡迎其他新想法。
- local num_in_batch=300
- local batch_counter=0
- local log_display_in_batch=1000
- local bbl_counter=0
- local num_in_bl_counter=0
- declare -a bbl_arr=()
- local keyword=
- local keyword_del
-
- logMsg $debug_flag null "Starting blacklist checking in batch."
- for msisdn in `cut -d: -f2 $tmpfile`; do
- if [ $batch_counter -eq $num_in_batch ]; then
- keyword="${keyword}$msisdn"
- bbl_arr=(`sed -rn "/$keyword/p" $filter_file`)
- local num=${#bbl_arr[@]}
- ((num_in_bl_counter+=num))
- if [ $num -gt 1 ]; then
- keyword_del=`echo ${bbl_arr[@]} | tr " " "|"`
- sed -ri "/${keyword_del}/d" $inputfile
- fi
- keyword=
- batch_counter=0
- else
- keyword="${keyword}$msisdn|"
- fi
- if [ $((bbl_counter%log_display_in_batch)) -eq 0 ]; then
- logMsg $debug_flag null "$bbl_counter MSISDN processed."
- fi
- ((batch_counter++))
- ((bbl_counter++))
- done
復(fù)制代碼