2009-11-20 62 views
1

目錄中有大約20個文件。每個文件都有內部的字符串$str用於從目錄中的文件列表中搜索的bash腳本

我想編寫一個腳本來挑選包含字符串$str的行並將其轉儲到文件中。

每個文件都應該將搜索到的行轉儲到不同的文件中。

例如file1中轉儲檢索行文件調用,招致和file2文件備份到硬盤稱爲found2等....

任何人都可以請指導我對此?

我特別發現很難在grep命令中包含文件名。

我不能繼續包括20個grep命令。

回答

3

打印與數字行:

grep -n "\$str" filename 

遍歷文件:

for file in *; 
do 
    grep -n "\$str" $file >> "$file".result; 
done 
+0

@Am:沒關係! +1 – RageZ 2009-11-20 06:23:03

+0

@Ragez,我測試過,失敗了,現在沒關係:) – Amirshk 2009-11-20 06:29:16

+1

-1使用(ls)。 - >爲文件在*將做。 – ghostdog74 2009-11-20 06:32:11

3
for fname in file*; do 
    grep ${str} ${fname} > ${fname/file/found} 
done 

神奇的是在${fname/file/found}。這取得變量${fname}的值,但用'found'代替'file'的第一次出現。

如果您需要更復雜的轉換,您可以通過sed運行文件名。比方說,你想替換用「發現」你可以做到這一點「文件」的每一次出現:

for fname in file*; do 
    outfile=$(echo ${fname} | sed -e 's/file/found/g') 
    grep ${str} ${fname} > ${outfile} 
done 
+0

不需要使用sed。用shell,只需要$ {fname // file/found} – ghostdog74 2009-11-20 07:09:53

1

使用呆子

str="mypattern" 
gawk -v str=$str 'FNR==1{close("found_"d);d++}$0~str{print $0>"found_"d}' file* 

或完全與外殼

#!/bin/bash 
d=0 
str="mystring" 
for files in file file1 file2 
do 
    d=$((d+1)) 
    f=0 
    while read -r line 
    do 
     case "$line" in 
     *$str*) echo $line >> "found_$d" ; f=1;;  
     esac 
    done < ${files} 
    [ "$f" -eq 0 ] && d=$((d-1)) 
done