当前位置:Linux教程 - Shell - shell - 找出一个文件中出现某str的次数

shell - 找出一个文件中出现某str的次数

找出一个文件中出现某str的次数
2004-04-23 15:18 pm
来自:Linux文档
现载:Www.8s8s.coM
地址:无名

找出一个文件比如test中出现hello的次数。

小弟有一计,不知可否:
awk '/hello/{print $0}' test > test1
awk 'BEGIN{FS=' ';OFS=''}{print $0}' test1 > test2
sed 's/$/aaa/' test2 > test3
awk 'BEGIN{FS='hello';OFS=' ';}' test3 > test4
length=`cat test3 | wc -l`
length=`length - 1`



执行了一下,有语法错误。我再仔细看看。
看的出来,阁下的shell水平很高。
或许命令awk的使用是关键,这个我不很熟,需要恶补一下。

可能是最后一句有错,我的意思是将length的值减去1,可能写法不对

好象第一行执行就有错。可能是分隔符闹的吧。
最后一句确实不对,应该是:
length=`expr $length - 1`

/hello/和{print $0}之间应当有空格,程序的思路大体是这样:
首先,将文件中所有包含'hello'的行输出到test1中,然后将文件的所有行连成一行输出到test2,这样test2就变成了只有一行的文件,然后为了避免文件的最后一个单词是'hello'造成边界问题,在test2的最后加上'aaa',输出到test3,然后以'hello'为分割符,回车为输出的分割符将内容输出到test4,这样文件中有多少个'hello'就会有多少个回车,也就是有多少行,当然最后别忘了减一

赋值语句可以直接用 let length=$length-1


下面引用由feeling在 2002/01/29 02:23pm 发表的内容:
赋值语句可以直接用 $length=$length-1 或者 let length=$length-1


你这指的是什么shell呀。据我所知,B SHELL和K SHELL是不能这样写的。

这样写行不行:
number=`more test|tr 'hello'|wc -w` #计算以hello为界限拔test分为几部分
number=`expr $number - 1` #上面的办法会多计上一个,所以这里减掉一。

呵呵,偶又生一计:
sed 's/hello/ hello /' test > test1
sed '/hello/' test1 > test2
length=`cat test2 | wc -l`


哈哈,I got it,在AIX上调试通过:
sed 's/$/qqq/' test > test1
cat test1 | tr -d ' ' > test2
cat test2 | tr 'hello' ' ' > test3
length=`cat test3 | wc -l`
length=`expr $length - 1`

刚翻出这个旧帖,觉得可以这样:
awk '{for (i=1;i<=NF;i++) if ($i == "hello") count++} END{print count}' file

在valentine的启发下,我也提出一种解法
sed 's/hello/hello@/g' test | tr '@' ' ' | grep -c hello

Num=0
awk '/hello/' test | while read Line
do
Num=`expr $Num + 1`
done
echo $Num
这样子不知道行不行?



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

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

注意,以上在csh中通过

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