Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

shell的效率不如perl或Python?

Posted on 2010-06-07 12:25 Prayer 阅读(2569) 评论(0)  编辑 收藏 引用 所属分类: ShellPERL
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的代码,欢迎其他新想法。
  1.                 local num_in_batch=300
  2.                 local batch_counter=0
  3.                 local log_display_in_batch=1000
  4.                 local bbl_counter=0
  5.                 local num_in_bl_counter=0
  6.                 declare -a bbl_arr=()
  7.                 local keyword=
  8.                 local keyword_del

  9.                
  10.                 logMsg $debug_flag null "Starting blacklist checking in batch."

  11.                 for msisdn in `cut -d: -f2 $tmpfile`; do       
  12.                         if [ $batch_counter -eq $num_in_batch ]; then
  13.                                 keyword="${keyword}$msisdn"
  14.                                 bbl_arr=(`sed -rn "/$keyword/p" $filter_file`)
  15.                                 local num=${#bbl_arr[@]}
  16.                                 ((num_in_bl_counter+=num))
  17.                                 if [ $num -gt 1 ]; then
  18.                                         keyword_del=`echo ${bbl_arr[@]} | tr " " "|"`
  19.                                         sed -ri "/${keyword_del}/d" $inputfile
  20.                                 fi
  21.                                 keyword=
  22.                                 batch_counter=0
  23.                         else
  24.                                 keyword="${keyword}$msisdn|"
  25.                         fi
  26.                         if [ $((bbl_counter%log_display_in_batch)) -eq 0 ]; then
  27.                                 logMsg $debug_flag null "$bbl_counter MSISDN processed."
  28.                         fi
  29.                         ((batch_counter++))
  30.                         ((bbl_counter++))
  31.                 done
复制代码

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理