- 論壇徽章:
- 0
|
兩年之前,我偶然看到Winter博客上一篇《強大的Sed命令--背唐詩的Shell小程序》的小文章,引發(fā)了我對Shell編程的興趣。對sed, awk命令進行了深入研究。在CU的Shell論壇上修煉多日。今天在回頭看這篇文章,有一些反思。
Winter的這個唐詩程序為了隨機抽取唐詩顯示,卻寫了20多行,使用了諸多種類命令,同時也沒有體現(xiàn)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
復制代碼
如果唐詩總數(shù)目小于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命令可以達到你意想不到效果。
這里就有一個很有意思的例子,請看題:
現(xiàn)在有300多首唐詩放在一個文本文件中,格式是用"% 。。。%"分開,中間是一首唐詩,例如:%
%
《西施詠》
作者:王維
艷色天下重,西施寧久微。
朝為越溪女,暮作吳宮妃。
賤日豈殊眾,貴來方悟稀。
邀人傅粉粉,不自著羅衣。
君寵益嬌態(tài),君憐無是非。
當時浣紗伴,莫得同車歸。
持謝鄰家子,效顰安可希。
%
《秋登蘭山寄張五》
作者:孟浩然
北山白云里,隱者自怡悅。
相望始登高,心隨雁飛滅。
愁因薄暮起,興是清秋發(fā)。
時見歸村人,沙行渡頭歇。
天邊樹若薺,江畔洲如月。
何當載酒來,共醉重陽節(jié)。
%
現(xiàn)在要求每次運行程序,系統(tǒng)會隨機選一首唐詩打印出來。要是你會如何做?
看看我這段腳本,總共才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編程 |
|