我想在文件中搜索模式并删除包含模式的行。要做到这一点,我正在使用:
originalLogFile='sample.log'
outputFile='3.txt'
temp=$originalLogFile
while read line
do
echo "Removing"
echo $line
grep -v "$line" $temp > $outputFile
temp=$outputFile
done <$whiteListOfErrors
这适用于第一次迭代。对于第二次运行,它会抛出:
grep: input file ‘3.txt’ is also the output
任何解决方案或替代方法?
答案 0 :(得分:3)
以下内容应相同
grep -v -f "$whiteListOfErrors" "$originalLogFile" > "$outputFile"
答案 1 :(得分:0)
originalLogFile='sample.log'
outputFile='3.txt'
tmpfile='tmp.txt'
temp=$originalLogFile
while read line
do
echo "Removing"
echo $line
grep -v "$line" $temp > $outputFile
cp $outputfile $tmpfile
temp=$tmpfile
done <$whiteListOfErrors
答案 2 :(得分:0)
使用sed
:
sed '/.*pattern.*/d' file
如果您有多种模式,可以使用-e
选项
sed -e '/.*pattern1.*/d' -e '/.*pattern2.*/d' file
如果你有GNU sed
(在Linux上是典型的)-i
选项很舒服,因为它可以修改原始文件而不是写入新文件。 (但请小心处理,以免覆盖原件)
答案 3 :(得分:0)
用它来解决问题:
while read line
do
echo "Removing"
echo $line
grep -v "$line" $temp | tee $outputFile
temp=$outputFile
done <$falseFailures
答案 4 :(得分:-1)
简单的解决方案可能是使用交替文件; e.g。
idx=0
while ...
let next='(idx+1) % 2'
grep ... $file.$idx > $file.$next
idx=$next
更优雅的可能是创建一个大的grep
命令
args=( )
while read line; do args=( "${args[@]}" -v "$line" ); done < $whiteList
grep "${args[@]}" $origFile