匹配每行不等于10个字符的行:
awk 'length($0)!=10' file
egrep -v "^.{10}$" file
perl -lne 'print if length != 10' file
awk -F '' 'NF!=10' file
sed '/^.\{10\}$/d' file
awk '!/^..........$/' file
sed '/^..........$/d'file
SHELL只是一个接口,大部分的功能全靠外部程序来完成。
而Perl是一种语言,基本上什么事情都能做。
相比较而言,awk、sed就像死板手,而perl和python是个活板手。
awk和sed专注于文本处理,大部分情况效率要优于perl等。很简单,比如列文件,谁能有cat的效率高?
如果你是个懒惰的SA,那就用shell吧。如果是geek或者你的工作需要复杂的逻辑,并且还会出现许多无法预知的新要求,那就用perl等好了。
不信无所谓,说一千遍抵不上试一遍。
况且每种场合的需求也会有变化。
由于是项目中涉及的任务,具体的数据不便给出。
且在此瞎说一通,有问题,大家一起共勉。
在http请求的发送处理上:
在将文件输入的一行作为http get的参数完成访问并处理返回结果的场合中
gawk,在每一行的处理过程中一次性完成HTTP访问和响应处理。 70 req/s
shell,调用netcat发送HTTP后,用纯shell处理效率也很差。 20 req/s
perl ,在密集调用时,资源释放都来不及,有时候就调死在哪里了。 20 req/s
java,用sun的原生类包效率非常高的。 500 request/s
其他工具,如apache ab,220 request/s
gawk Network接口,可以在下面的章节中全面了解
O'Reilly.Effective.awk.Programming.3rd.Edition Section 14.
... P_002fIP-Networking
另外可以说说 一般如何去考虑提高执行效率的。
shell如何提高执行效率?
多用内部命令,少用外部命令。
批处理IO, 如涉及输入文件的,尽量一次性载入内存(如数组),或按批量输入缓冲区处理。
减少外部命令的涉及量。
多子进程并行处理。但需要考虑进程间如何进行相互协调和通知。
在千万行级的文本文件中,尤其是有非常多项,需要n多次搜索时,如何提高全文搜索执行效率?
在多项或逻辑的搜索中,搜索可以用批处理搜索来减少循环次数,从而大幅提高整体执行效率。
sed命令行,用脚本先组织好多项选择命令行。一般搜索内容,可以通过灵活指定几百个或的选项。
一次就能完成几百个单位的全文搜索。需要注意只有gnu sed才支持RE模式。或用egrep实现。
例如:
如果有10000个关键字需要搜索,难道要循环一万次搜索? 没到亿级那么多,1万~10万还是有的,在此更正。
可以一次搜索100个,只要搜一百次,一次搜500个,只要搜20次。
一次支持多少个关键字同时搜,每个工具可能不太一样。 sed 至少能支持 200个关键字。
egrep好像不太多。 以后可以在找机会试试极限情况。
如, egrep "123|456|789|...|135|246|" bigfile
sed -r "123|456|789|...|135|246|" bigfile
怎么随机生成4亿行小于等于10个字符的文件:
a=1
while [ $a -le 40 ];do
LENGTH=$((RANDOM%10+1))
b=1
while [ $b -le $LENGTH ];do
printf A
((b=$b+1))
done
printf "\n"
((a=$a+1))
done
=====================================
a=1
while [ $a -le 40 ];do
LENGTH=$((RANDOM%10+1))
b=1
while [ $b -le $LENGTH ];do
ASCII=$((RANDOM%95+32))
perl -le "printf chr($ASCII)"
((b=$b+1))
done
printf "\n"
((a=$a+1))
done
阅读(720) | 评论(0) | 转发(0) |