Posted on 2010-06-07 12:25
Prayer 閱讀(2621)
評論(0) 編輯 收藏 引用 所屬分類:
Shell 、
PERL
shell文本處理方面,主要是有sed,awk這兩把刀。
光給你個shell你進行文本處理是做不到的,當然簡單的還可以。
perl里有正則表達式引擎,能針對文本進行拆分替換等復雜操作,關鍵是,perl不用fork出新的進程來處理這些事情,而shell需要使用管道等通過這些sed,awk的進程來處理,至少就多出部分進程的開銷。
而且,管道這個東西,原本一個工具一次能完成的任務,在需要經過sed,和awk等多次管道。效率可想而知。
其實你這個問題問的有點弱智,SHELL是什么?
SHELL只是一個接口,大部分的功能全靠外部程序來完成。 而Perl是一種語言,基本上什么事情都能做。 |
老老實實學好一樣東西最實際。
當你參加面試的時候,如果可以自信的說自己熟練使用Shell或者Perl,那就相當不錯了。
效率之類的云云,具體問題具體分析吧,能解決工作中遇到的問題就行。
看出來樓主比較關心文本處理,下面這個比方不一定恰當,但已經很接近了:
- 相比較而言,awk、sed就像死板手,而perl和python是個活板手。
- awk和sed專注于文本處理,大部分情況效率要優于perl等。很簡單,比如列文件,誰能有cat的效率高?
- 如果你是個懶惰的SA,那就用shell吧。如果是geek或者你的工作需要復雜的邏輯,并且還會出現許多無法預知的新要求,那就用perl等好了。
|
沒那么多關鍵字,是打字手誤,但是1-10萬數量級的關鍵字,在千萬行級文本文件中搜索,這個量還是有的。
來段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
復制代碼