- 论坛徽章:
- 0
|
两年之前,我偶然看到Winter博客上一篇《强大的Sed命令--背唐诗的Shell小程序》的小文章,引发了我对Shell编程的兴趣。对sed, awk命令进行了深入研究。在CU的Shell论坛上修炼多日。今天在回头看这篇文章,有一些反思。
Winter的这个唐诗程序为了随机抽取唐诗显示,却写了20多行,使用了诸多种类命令,同时也没有体现Sed的强大。
其实这个功能用寥寥几行就能完成。
- total=`grep '%' tang300.txt | wc -l`
- awk -v "myp=$total" -v "thernd=$RANDOM" '
- BEGIN{ RS="%";myp=int(thernd*(myp-1)/32767+2);}
- (NR==myp){ print $0; exit; } ' tang300.txt
复制代码
如果唐诗总数目小于256
- total=`grep % tang300.txt | wc -l`
- myp=`echo "$RANDOM * $total / 32767 + 1" | bc -q`
- sed -n "/%/{H;g;/\\(\\n%\\)\\{$myp\\}/{:a
- N;\$q;/%\$/!ba
- s/\\n%//g;p;q;};}" tang300.txt
复制代码
原文出处http://www.winterxy.com/blog/000134.html
强大的Sed命令--背唐诗的Shell小程序
Sed命令是Unix/Linux平台上的行编辑工具,正确使用Sed命令可以达到你意想不到效果。
这里就有一个很有意思的例子,请看题:
现在有300多首唐诗放在一个文本文件中,格式是用"% 。。。%"分开,中间是一首唐诗,例如:%
%
《西施咏》
作者:王维
艳色天下重,西施宁久微。
朝为越溪女,暮作吴宫妃。
贱日岂殊众,贵来方悟稀。
邀人傅粉粉,不自著罗衣。
君宠益娇态,君怜无是非。
当时浣纱伴,莫得同车归。
持谢邻家子,效颦安可希。
%
《秋登兰山寄张五》
作者:孟浩然
北山白云里,隐者自怡悦。
相望始登高,心随雁飞灭。
愁因薄暮起,兴是清秋发。
时见归村人,沙行渡头歇。
天边树若荠,江畔洲如月。
何当载酒来,共醉重阳节。
%
现在要求每次运行程序,系统会随机选一首唐诗打印出来。要是你会如何做?
看看我这段脚本,总共才20来行:
#!/bin/sh
DATAFILE=/home/wende/bin/tang300.u8
IDXFILE=$DATAFILE.idx.txt
if [ ! -e $IDXFILE ] ;then
grep -n "%" $DATAFILE | awk -F':' '{print $1}' > $IDXFILE;
fi
LINECNT=`wc -l $IDXFILE|awk '{print $1}'`;
FIRST=`expr $RANDOM % $LINECNT`
let SECOND=$FIRST+1;
CMD="sed -n -e '$FIRST p' $IDXFILE";
start=`eval $CMD`
CMD="sed -n -e '$SECOND p' $IDXFILE";
end=`eval $CMD`
let start=$start+1
let end=$end-1;
CMD="sed -n -e '$start,$end p' $DATAFILE";
eval $CMD
看明白了吗?其中使用了sed, awk, grep, eval, expr, wc, let 等命令。如果你对这些命令不了解,可以看看: 深入浅出Shell编程 |
|