bash - удалить несколько разных строк текста из текстового файла

Я работаю с большим количеством файлов журнала, и большинство файлов журнала имеют много повторяющихся строк, которые регистрируются несколько раз. Чтобы сделать журналы легко видимыми для других, которые не имеют ничего общего с такими вещами (и для меня самого), я хотел создать сценарий, который удаляет некоторые текстовые строки, которые могут вызвать "ложную тревогу" для других людей., ("Эй, админ, у меня есть эти ошибки здесь несколько раз"; > "Вздох, эти ошибки ничего не значат")

Есть ли какой-нибудь bash-код с grep, cat или awk, который может избавиться от множества различных текстовых строк, не просматривая документ снова и снова для каждой удаляемой строки? (в основном удалите все мусорные строки одним махом)

Например, я выделю строки, которые я хочу удалить жирным шрифтом:

Одна вещь, я не знаю, почему

Даже неважно, как сильно ты стараешься

Имейте это в виду, я разработал эту рифму

Объяснить в свое время

Все я знаю

время ценно

Смотреть, как он летит, как маятник качается

Смотреть обратный отсчет до конца дня

Часы отсчитывают жизнь

Это так нереально

Не смотрел ниже

Смотрите, как время идет прямо в окно

Пытался удержаться, но даже не знал

Впустую все это просто

Смотреть как ты

Извините за тексты песен Linkin Park, слушая радио, пытаясь решить проблему, иногда приводим несколько плохих примеров:P

Все эти строки можно удалить в одной команде? Большое спасибо, если кто-нибудь знает как.

3 ответа

Решение
grep -v "<string1>\|<string2>\|<stringN>" /path/to/file

Удаляет строки, представленные в массиве not_wanted.

#!/bin/bash
    exec < example.txt
    not_wanted[0]="It doesn’t even matter how hard you try"
    not_wanted[1]="time is a valuable thing"
    not_wanted[2]="The clock ticks life away"
    not_wanted[3]="It’s so unreal"
    not_wanted[4]="Trying to hold on but didn’t even know"

    while read line; do
        for i in "${not_wanted[@]}"; do
            if [ "$line" == "$i" ]; then unset line; break; fi
        done 
        if [ "$line" ]; then echo "$line"; fi
    done

Поместите строки, которые вы не хотите, в файл, затем

grep -v -f not.wanted filename > smaller.file
Другие вопросы по тегам