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