|
蓝森林 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] |
奇怪,我的结果和你的不同 |
| |