蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程


    

蓝森林 http://www.lslnet.com 2006年6月26日 11:18


求教:读取各个目录下文件逐行匹配给定文件中各行字符?

#ls -l
dir_a dir_b dir_c
#ls dir_a
file_a file_b file_c
#cat dir_a/file_a
abcd
bbbbbb
ffffffff
fdsfdsfds
fdsfdsfsd
fsdfds

如上所示,我的目录有dir_a dir_b dir_c,而每个目录下有许多文件,每个文件包括不同的内容。

我现在需要根据一个file文件中的内容逐行来匹配各个目录下的各个文件,请问用什么语句合适。

while read line;
do
for i in `ls`;do
#action
done
done<file

以上是我得简单思路,或许还有其他好方法,烦请高手不吝赐教。

这样?
[ -e "$line" ] && echo file exsists \
  || echo no such file


不对,楼上没理解我的意思。
我要匹配的是文件中的内容,并统计出现了几次?
比如file_a的内容是
abc
aaa
bbb
那我用abc来匹配,结果是出现了一次,而abc是file中的内容之一,所以要循环逐行来匹配。

我又不是你肚子里的蛔虫,你没说出来事情都知道。^_^
先把你的问题描述清楚了再说吧,算我多嘴。

-->

while read line;
do
  find ./ -type f|xargs grep -c $line
done<file

这样是否可行

看不懂的说~
BTW:dir_a到底是文件还是目录?

dir_a是目录,
fjfd 给的答案不管用,陷入循环里跳不出来,而且也不能用find -type f来表示,因为只有子目录里的文件需要处理,当前文件下的不在其中范围。


ps:woodie  兄,实在抱歉,上次给的perl很好用,再次感谢


ls -l| grep -o -F -f file|sort|uniq -c

惭愧,grep的某些参数,我都没掌握完,用楼上的应该能很好完成

       -F, --fixed-strings
              Interpret PATTERN as a list of fixed strings, separated by  new-
              lines,  any of which is to be matched.  -P, --perl-regexp Inter-
              pret PATTERN as a Perl regular expression.

       -f FILE, --file=FILE
              Obtain patterns from FILE, one per line.  The  empty  file  con-
              tains zero patterns, and therefore matches nothing.

测试了一下,可以满足匹配,但匹配数都是 1,这个没关系,我再用其他方法补救

问题是,我还不知道怎么读取各个目录下的文件来匹配patterns
find . -type f
ls */*
ls -R
都感觉不好。不能正确用于我的shell中

哪位高手给个完整例子,谢谢

-->
what's wrong with 4th floor 's solution ? it should work fine with any platform .
post your runtime result for running that piece of commands please , and clarify what exactly the solution you are looking for .

谢谢楼上提醒,我确实没准确表达我的意思,具体过程如下:

[root@rh9bk f]# ls -l
total 16
drwxr-xr-x    2 root     root         4096 Jun  9 23:58 dir_a
drwxr-xr-x    2 root     root         4096 Jun  9 23:57 dir_b
drwxr-xr-x    2 root     root         4096 Jun  9 23:55 dir_c
-rw-r--r--    1 root     root           54 Jun  9 23:56 file
其中dir_a dir_b dir_c 是目录,file文件包含了我要匹配的内容
每个目录下有不同的文件,而某些文件正包含了我需要查找的内容,我需要统计每个内容在每个目录里共出现的次数。
[root@rh9bk f]# ls -R
.:
dir_a  dir_b  dir_c  file

./dir_a:
file_1  file_2  file_44444

./dir_b:
file_111  file_eee  file_xxxx

./dir_c:
file_a  file_b  file_c  _file_g  file_x  file_y  file_z

如果:
字符abc在dir_a中各个file_x共出现3次
字符bbb在dir_c中各个file_x共出现了5次
要求达到的效果:
abc dir_a 3
abc dir_b 0
abc dir_c 0
bbb dir_a 0
bbb dir_b 0
bbb dir_c 5


用这个语句可以满足部分要求,但输出效果不是我想要的
grep -o -f file -r .

while read s_string
   do
       for s_dir in `ls -p |grep /`
         do
            echo "$s_string \c" && echo "$s_dir \c" &&  grep -c $s_string $s_dir*  
         done
  done <file

谢谢楼上,思路是对的,但结果显然不对,我已经测试
运行后,部分结果如下,太乱了,而且是按照文件匹配来统计的,我需要的是按照目录为单位来统计匹配数
dir_b/file_eee:0
dir_b/file_xxxx:1
dir_c/file_a:1
dir_c/file_b:1
dir_c/file_c:0
dir_c/_file_g:0
dir_c/file_x:0
dir_c/file_y:0
dir_c/file_z:0
dir_a/file_2:0
dir_a/file_44444:0
dir_b/file_eee:0
dir_b/file_xxxx:0
dir_c/file_b:0
dir_c/file_c:0
dir_c/_file_g:0
dir_c/file_x:0
dir_c/file_y:0
dir_c/file_z:0
[root@rh9bk f]# vi c
[root@rh9bk f]# sh c
abc \c
dir_a/ \c
dir_a/file_1:3
dir_a/file_2:1
dir_a/file_44444:0
abc \c
dir_b/ \c
dir_b/file_111:3
dir_b/file_eee:0
dir_b/file_xxxx:1
abc \c
dir_c/ \c
dir_c/file_a:3
dir_c/file_b:1
dir_c/file_c:0
dir_c/_file_g:0
dir_c/file_x:0
dir_c/file_y:0
dir_c/file_z:0
aaaaa \c
dir_a/ \c
dir_a/file_1:0
dir_a/file_2:0
dir_a/file_44444:0
aaaaa \c
dir_b/ \c
dir_b/file_111:0
dir_b/file_eee:0
dir_b/file_xxxx:0
aaaaa \c
dir_c/ \c
dir_c/file_a:0
dir_c/file_b:0
dir_c/file_c:0
dir_c/_file_g:0
dir_c/file_x:0
dir_c/file_y:0
dir_c/file_z:0
bbbbbbbb \c
dir_a/ \c
dir_a/file_1:0
dir_a/file_2:0
dir_a/file_44444:0
bbbbbbbb \c
dir_b/ \c
dir_b/file_111:0
dir_b/file_eee:0
dir_b/file_xxxx:0
bbbbbbbb \c
dir_c/ \c
dir_c/file_a:0
dir_c/file_b:0
dir_c/file_c:0
dir_c/_file_g:0
dir_c/file_x:0
dir_c/file_y:0
dir_c/file_z:0
12345 \c
dir_a/ \c
dir_a/file_1:0
dir_a/file_2:0
dir_a/file_44444:0
12345 \c
dir_b/ \c
dir_b/file_111:0
dir_b/file_eee:0
dir_b/file_xxxx:0
12345 \c
dir_c/ \c
dir_c/file_a:0
dir_c/file_b:0
dir_c/file_c:0
dir_c/_file_g:0
dir_c/file_x:0
dir_c/file_y:0
dir_c/file_z:0
23456 \c
dir_a/ \c
dir_a/file_1:0
dir_a/file_2:0
dir_a/file_44444:0
23456 \c
dir_b/ \c
dir_b/file_111:0
dir_b/file_eee:0
dir_b/file_xxxx:0
23456 \c
dir_c/ \c
dir_c/file_a:0
dir_c/file_b:0
dir_c/file_c:0
dir_c/_file_g:0
dir_c/file_x:0
dir_c/file_y:0
dir_c/file_z:0
ttttt \c
dir_a/ \c
dir_a/file_1:0
dir_a/file_2:0
dir_a/file_44444:0
ttttt \c
dir_b/ \c
dir_b/file_111:0
dir_b/file_eee:0
dir_b/file_xxxx:0
ttttt \c
dir_c/ \c
dir_c/file_a:0
dir_c/file_b:0
dir_c/file_c:0
dir_c/_file_g:0
dir_c/file_x:0
dir_c/file_y:0
dir_c/file_z:0
wwfef \c
dir_a/ \c
dir_a/file_1:0
dir_a/file_2:0
dir_a/file_44444:0
wwfef \c
dir_b/ \c
dir_b/file_111:0
dir_b/file_eee:0
dir_b/file_xxxx:0
wwfef \c
dir_c/ \c
dir_c/file_a:0
dir_c/file_b:0
dir_c/file_c:0
dir_c/_file_g:0
dir_c/file_x:0
dir_c/file_y:0
dir_c/file_z:0
fdsfd \c
dir_a/ \c
dir_a/file_1:1
dir_a/file_2:0
dir_a/file_44444:0
fdsfd \c
dir_b/ \c
dir_b/file_111:1
dir_b/file_eee:0
dir_b/file_xxxx:0
fdsfd \c
dir_c/ \c
dir_c/file_a:1
dir_c/file_b:0
dir_c/file_c:0
dir_c/_file_g:0
dir_c/file_x:0
dir_c/file_y:0
dir_c/file_z:0
sdf \c
dir_a/ \c
dir_a/file_1:1
dir_a/file_2:1
dir_a/file_44444:0
sdf \c
dir_b/ \c
dir_b/file_111:1
dir_b/file_eee:0
dir_b/file_xxxx:1
sdf \c
dir_c/ \c
dir_c/file_a:1
dir_c/file_b:1
dir_c/file_c:0
dir_c/_file_g:0
dir_c/file_x:0
dir_c/file_y:0
dir_c/file_z:0
\c
dir_a/ \c
dir_a/file_2:0
dir_a/file_44444:0
\c
dir_b/ \c
dir_b/file_eee:0
dir_b/file_xxxx:0
\c
dir_c/ \c
dir_c/file_b:0
dir_c/file_c:0
dir_c/_file_g:0
dir_c/file_x:0
dir_c/file_y:0
dir_c/file_z:0


-->

[code][saixu25]/tmp/tst$ ls -p
1.sh   a/     b/     c/     file
[saixu25]/tmp/tst$ cat a/a.1
aaa
bbb
ccc
[saixu25]/tmp/tst$ cat b/b.1
ddd
eee
[saixu25]/tmp/tst$ cat c/c.1
aa
ddd
bbb
[saixu25]/tmp/tst$ cat file
aaa
ddd
[saixu25]/tmp/tst$ cat 1.sh
while read s_string
   do
       for s_dir in `ls -p |grep /`
         do
            echo "$s_string \c" && echo "$s_dir \c" &&  grep -c $s_string $s_dir*  
         done
  done <file
[saixu25]/tmp/tst$ sh 1.sh
aaa a/ 1
aaa b/ 0
aaa c/ 0
ddd a/ 0
ddd b/ 1
ddd c/ 1[/code]

奇怪,我的结果和你的不同



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com