bash脚本,用于从目录中的文件列表中进行搜索

时间:2009-11-20 06:13:27

标签: bash scripting

目录中有大约20个文件。每个文件中都包含字符串$str

我想编写一个脚本来挑选包含字符串$str的行并将其转储到文件中。

每个文件都应将搜索到的行转储到不同的文件中。

例如,file1转储搜索的行到文件名为found1,file2将其转储到名为found2等的文件中....

有人可以指导我吗?

我特别发现很难在grep命令中包含文件名。

我无法继续包含20个grep命令。

3 个答案:

答案 0 :(得分:3)

用数字打印行:

grep -n "\$str" filename

迭代文件:

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

答案 1 :(得分:3)

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

魔法在${fname/file/found}。这将获取变量${fname}的值,但将'file'的第一次出现替换为'found'。

如果您需要更复杂的转换,可以通过sed运行文件名。假设你想用'found'替换每个'file'的出现你可以这样做:

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

答案 2 :(得分:1)

使用gawk

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

或完全使用shell

#!/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