目錄中有大約20個文件。每個文件都有內部的字符串$str
。用於從目錄中的文件列表中搜索的bash腳本
我想編寫一個腳本來挑選包含字符串$str
的行並將其轉儲到文件中。
每個文件都應該將搜索到的行轉儲到不同的文件中。
例如file1中轉儲檢索行文件調用,招致和file2文件備份到硬盤稱爲found2等....
任何人都可以請指導我對此?
我特別發現很難在grep命令中包含文件名。
我不能繼續包括20個grep命令。
目錄中有大約20個文件。每個文件都有內部的字符串$str
。用於從目錄中的文件列表中搜索的bash腳本
我想編寫一個腳本來挑選包含字符串$str
的行並將其轉儲到文件中。
每個文件都應該將搜索到的行轉儲到不同的文件中。
例如file1中轉儲檢索行文件調用,招致和file2文件備份到硬盤稱爲found2等....
任何人都可以請指導我對此?
我特別發現很難在grep命令中包含文件名。
我不能繼續包括20個grep命令。
打印與數字行:
grep -n "\$str" filename
遍歷文件:
for file in *;
do
grep -n "\$str" $file >> "$file".result;
done
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
不需要使用sed。用shell,只需要$ {fname // file/found} – ghostdog74 2009-11-20 07:09:53
使用呆子
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
@Am:沒關係! +1 – RageZ 2009-11-20 06:23:03
@Ragez,我測試過,失敗了,現在沒關係:) – Amirshk 2009-11-20 06:29:16
-1使用(ls)。 - >爲文件在*將做。 – ghostdog74 2009-11-20 06:32:11