目录中有大约20个文件。每个文件中都包含字符串$str
。
我想编写一个脚本来挑选包含字符串$str
的行并将其转储到文件中。
每个文件都应将搜索到的行转储到不同的文件中。
例如,file1转储搜索的行到文件名为found1,file2将其转储到名为found2等的文件中....
有人可以指导我吗?
我特别发现很难在grep命令中包含文件名。
我无法继续包含20个grep命令。
答案 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