Как найти повторяющиеся [s] строки [s] и удалить их?

Мне пришлось добавить в свой файл nrpe.cfg эту строку на более чем 200 серверах:

command[check_utc]=/company/nrpe/libexec/check_utc.sh

Но для некоторых проблем некоторые машины имеют более одного раза эту строку. Итак, теперь я хотел бы проверить, есть ли более одного раза, и удалить его, оставив только одну строку с указанной командой. Мне нужно сделать это в сценарии shell.


person Valter Silva    schedule 17.04.2013    source источник
comment
Они не соседи, Стивен.   -  person Valter Silva    schedule 17.04.2013


Ответы (2)


Способ 1. Удалите все повторяющиеся строки

    cat filename | sort | uniq > outfile
    mv outfile filename

Символы | передают выходные данные команд слева в команды справа в качестве входных данных.

Команда cat считывает содержимое файла в стандартный вывод (экран или другой файл)

Команда sort сортирует вывод в алфавитном порядке, что необходимо перед использованием uniq...

Команда uniq удаляет соседние повторяющиеся значения

> outfile записывает вывод последнего шага в файл с именем «outfile».

Команда mv заменяет исходный файл новым файлом данных outfile.

Этот метод будет разрушительным, потому что он удалит все повторяющиеся строки ЛЮБОГО типа, а не только ту, которую вы хотите удалить.

Способ 2. Удалите все экземпляры определенной строки, а затем снова добавьте один раз

    cat filename | sed 's/command\[check_utc\]\=\/company\/nrpe\/libexec\/check_utc.sh//' > outfile
    mv outfile filename

Команда sed позволяет выполнять замену строк для определенных шаблонов строк. формат для такой команды - sed 's/find/replace/', чтобы найти первый экземпляр «найти» в каждой строке и заменить его на «заменить». Чтобы он работал с каждым экземпляром в каждой строке, вы добавляете «g» в конец, то есть sed 's/find/replace/g'

Символы \ заставляют sed буквально интерпретировать специальные символы в строке, которые в противном случае были бы неправильно истолкованы как специальные инструкции.

Приведенная выше команда полностью удалит все экземпляры этой конкретной строки (заменив ее ничем), после чего вам нужно будет отредактировать код и добавить его обратно один раз.

Способ 3. Удалите все экземпляры, а затем автоматически добавьте их в конец файла.

    cat filename | sed 's/command\[check_utc\]\=\/company\/nrpe\/libexec\/check_utc.sh//' > outfile
    mv outfile filename
    echo "command[check_utc]=/company/nrpe/libexec/check_utc.sh" >> filename

Это тот же код, что и выше, но после удаления всех экземпляров строки вы используете echo для печати строки и используете >> для добавления текста в конец содержимого файла.

person CaffeineConnoisseur    schedule 17.04.2013
comment
Этот файл является файлом конфигурации, как следует из его названия, nrpe.cfg, поэтому строки не являются смежными, и я должен оставить файл как есть, чтобы любая строка была изменена, просто удалите дублирующуюся строку. И дописать в конце. Спасибо за ваш ответ! - person Valter Silva; 17.04.2013
comment
F.Y.I. Я случайно включил \ в команду echo, они печатаются буквально эхом и должны быть исключены. Вы можете дважды проверить свой файл cfg, чтобы убедиться, что они не были включены в текст. Я изменил код соответственно. - person CaffeineConnoisseur; 17.04.2013

Если строки не соседние, и вы не против их отсортировать, это сработает.

$ cat foo.txt
wings of fire
this is a test
food that are killing you
this is a test

Результат

$ sort -u foo.txt
food that are killing you
this is a test
wings of fire
person Steven Penny    schedule 17.04.2013