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

用于从目录中的文件列表中搜索的bash脚本,bash,scripting,Bash,Scripting,一个目录中大约有20个文件。每个文件中都有字符串$str 我想编写一个脚本,将包含字符串$str的行挑选出来并转储到文件中 每个文件都应该将搜索到的行转储到不同的文件中 例如,file1将搜索到的行转储到名为found1的文件中,file2将其转储到名为found2的文件中,等等 有谁能告诉我这件事吗 我发现在grep命令中包含文件名特别困难 我不能继续包含20个grep命令。用数字打印行: grep -n "\$str" filename 迭代文件: for file in *; do

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

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

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

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

有谁能告诉我这件事吗

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


我不能继续包含20个grep命令。

用数字打印行:

grep -n "\$str" filename
迭代文件:

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

打印带有数字的行:

grep -n "\$str" filename
迭代文件:

for file in *;
do
    grep -n "\$str" $file >> "$file".result;
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
神奇之处在于
${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
目瞪口呆

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 
#/bin/bash
d=0
str=“mystring”
对于文件file1 file2中的文件
做
d=$((d+1))
f=0
而read-r行
做
大写“$line”
*$str*)回显$line>>“已找到\uU$d”;f=1;;
以撒
完成<${files}
[“$f”-等式0]&&d=$((d-1))
完成
使用gawk

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 
#/bin/bash
d=0
str=“mystring”
对于文件file1 file2中的文件
做
d=$((d+1))
f=0
而read-r行
做
大写“$line”
*$str*)回显$line>>“已找到\uU$d”;f=1;;
以撒
完成<${files}
[“$f”-等式0]&&d=$((d-1))
完成

@Ragez,我测试了一下,结果失败了,现在一切正常:)@ghostdog74:tnx,新东西everyday@Ragez,我测试了一下,结果失败了,现在一切正常:)@ghostdog74:tnx,每天都有新东西,不需要使用sed。对于shell,只需执行${fname//file/found}即可,无需使用sed。对于shell,只需执行${fname//file/found}