Ответ @rajish с использованием grep
был закрыл, но кое-что пропустил: задан вопрос об удалении одинаковых строк . По умолчанию grep
будет соответствовать строкам (частям строк).
POSIX grep имеет подходящий параметр:
-x
Учитывать только строки ввода, в которых используются все символы в строке, за исключением завершающей новой строки , чтобы соответствовать всей фиксированной строке или обычному выражение должно соответствовать строкам.
Учитывая это, для этого можно использовать grep
:
cp -f -p input.txt input.txt~
grep -v -x -F -f input.pat input.txt~ >input.txt
где input.pat содержит строки, которые необходимо удалить, а input.txt файл, который нужно обновить.
Решение @nvarun с использованием sed
имело аналогичную проблему, в дополнение к отсутствию экранирования символов /
в файле шаблона. Этот пример работает для меня и ограничивает синтаксис POSIX sed :
cp -f -p input.txt input.txt~
sed -e 's/\([\/]\)/\\\1/g' -e 's/^/\/^/' -e 's/$/$\/d/' input.pat > input.sed
sed -f input.sed input.txt~ >input.txt
На всякий случай оба сохраняют исходный файл перед его обновлением ( POSIX cp ).
input.pat
first
this is second
second/third
second\third
input.txt
first
only first should match
this is not first
this is second
the previous line said this is second
first/second/third
second/third
first\second\third
second\third
Результат:
only first should match
this is not first
the previous line said this is second
first/second/third
first\second\third
while [ $(pgrep -c ssh) -gt 1 ]
do
pkill --oldest -f ssh
done
Пока существует более одного ssh
процесса, убить самый старый ("наименее недавно запущенный" )один (s ). Наименее -недавно запущенный -может быть лучшей метрикой, чем «самый низкий PID», если ваше пространство PID зациклено или вы использовали рандомизированные PID.