Posted on 2010-06-07 12:25
Prayer 阅读(2569)
评论(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
复制代码