删除与模式匹配的行

时间:2013-11-26 21:22:04

标签: linux shell loops grep

我想在文件中搜索模式并删除包含模式的行。要做到这一点,我正在使用:

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

任何解决方案或替代方法?

5 个答案:

答案 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