ChinaUnix.net
 >> ChinaUnix.net > Shell

这个shell script 怎么写?

作者:shirley     发表时间:2002/01/29 10:55am

想写这么一个shell script, 找出一个文件比如test中出现hello的次数。
请大家帮帮忙,我还没想出来。

此文章相关评论:
该文章有23个相关评论如下:(点这儿可以发表评论)
mygod 发表于: 2002/01/29 11:13am
小弟有一计,不知可否:
awk '/hello/{print $0}' test > test1
awk  'BEGIN{FS='\n';OFS=''}{print $0}' test1 > test2
sed 's/$/aaa/' test2 > test3
awk 'BEGIN{FS='hello';OFS='\n';}' test3 > test4
length=`cat test3 | wc -l`
length=`length - 1`
 
shirley 发表于: 2002/01/29 11:38am
执行了一下,有语法错误。我再仔细看看。
看的出来,阁下的shell水平很高。
或许命令awk的使用是关键,这个我不很熟,需要恶补一下。
 
mygod 发表于: 2002/01/29 11:46am
可能是最后一句有错,我的意思是将length的值减去1,可能写法不对
 
shirley 发表于: 2002/01/29 11:57am
好象第一行执行就有错。可能是分隔符闹的吧。
最后一句确实不对,应该是:
length=`expr $length - 1`
 
mygod 发表于: 2002/01/29 12:31pm
/hello/和{print $0}之间应当有空格,程序的思路大体是这样:
首先,将文件中所有包含'hello'的行输出到test1中,然后将文件的所有行连成一行输出到test2,这样test2就变成了只有一行的文件,然后为了避免文件的最后一个单词是'hello'造成边界问题,在test2的最后加上'aaa',输出到test3,然后以'hello'为分割符,回车为输出的分割符将内容输出到test4,这样文件中有多少个'hello'就会有多少个回车,也就是有多少行,当然最后别忘了减一
 
feeling 发表于: 2002/01/29 02:23pm
[这个贴子最后由feeling在 2002/01/29 03:47pm 编辑]

赋值语句可以直接用 let length=$length-1
 
shirley 发表于: 2002/01/29 02:43pm
[quote][b]下面引用由[u]feeling[/u]在 [i]2002/01/29 02:23pm[/i] 发表的内容:[/b]
赋值语句可以直接用 $length=$length-1 或者 let length=$length-1
[/quote]
你这指的是什么shell呀。据我所知,B SHELL和K SHELL是不能这样写的。
 
feeling 发表于: 2002/01/29 03:43pm
[这个贴子最后由feeling在 2002/01/29 03:48pm 编辑]

写错了一点,已经修改。
在K Shell 下调试通过
 
mygod 发表于: 2002/01/29 05:08pm
请大家开动脑筋,看看还有没有其他方法
 
梦叮咚 发表于: 2002/01/29 05:18pm
我刚学shell,不过觉得上例有些烦琐,用c shell会不会简单一些.

不是很懂,只是提个想法.

 
feeling 发表于: 2002/01/29 06:09pm
如果只是想知道个数的话,可以简单地在vi模式用查找、替换命令来得到。
 
cpss 发表于: 2002/01/29 08:01pm
这样写行不行:
number=`more test|tr 'hello'|wc -w`  #计算以hello为界限拔test分为几部分
number=`expr $number - 1`  #上面的办法会多计上一个,所以这里减掉一。
 
mygod 发表于: 2002/01/30 10:13am
[这个贴子最后由mygod在 2002/01/30 10:15am 编辑]

呵呵,偶又生一计:
sed 's/hello/\nhello\n/' test > test1
sed '/hello/' test1 > test2
length=`cat test2 | wc -l`
 
shirley 发表于: 2002/01/30 11:01am
mygod真是高手啊。我的想法与你不谋而合。就是将hello用一个包含特殊标志的新行代替,然后计算包含特殊标志的行数。只是不知道在sed中怎样添加一个新行,好象\n不成。

从今天早上坐车开始,我就在琢磨sed的使用。

 
mygod 发表于: 2002/01/30 11:35am
哈哈,I got it,在AIX上调试通过:
sed 's/$/qqq/' test > test1
cat test1 | tr -d '\n' > test2
cat test2 | tr 'hello' '\n' > test3
length=`cat test3 | wc -l`
length=`expr $length - 1`
 
michaelds 发表于: 2002/03/13 07:09pm
刚翻出这个旧帖,觉得可以这样:
awk '{for (i=1;i<=NF;i++) if ($i == "hello") count++} END{print count}' file
 
mygod 发表于: 2002/03/14 08:36am
哇,高明!
 
txlinux 发表于: 2002/03/14 09:17am
佩服各位高手的SHELL功底!
小弟深受
 
txlinux 发表于: 2002/03/14 09:19am
。。。。
深受启发!

(刚才一不小心,错按了发表。:)

 
哈密瓜 发表于: 2002/03/14 09:26am
michaelds 跟 mygod两位高手太扎实了,pfpf!
 
bjchenxu 发表于: 2002/08/16 03:41pm
在valentine的启发下,我也提出一种解法
sed 's/hello/hello@/g' test | tr '@' '\n' | grep -c hello
 
HopeCao 发表于: 2002/08/17 09:52am
Num=0
awk '/hello/' test | while read Line
do
      Num=`expr $Num + 1`
done
echo $Num
这样子不知道行不行?
 
bjchenxu 发表于: 2002/08/19 04:51pm
[这个贴子最后由bjchenxu在 2002/08/19 06:12pm 编辑]

再来一招
编辑脚本文件sedfile
内容为:
s/hello/&\
/g

然后运行命令:
sed -f sedfile test | grep -c hello

注意,以上在csh中通过

-------------------
bash中就更加简单了
不用建立什么文件了
sed 's/hello/&\
/g' test | grep -c hello

 
 

Copyright © ChinaUnix.net  *  转载请注明出处及作者