Как удалить заданную строку из файла

#bash

#bash

Вопрос:

Я пишу скрипт BASH для интеграции пользовательской интрасети нашей компании с нашим почтовым сервером postfix. В одной ситуации скрипт должен удалить строку из виртуального файла postfix, который принимает следующую форму (по большей части): Адрес электронной почты, имя пользователя.

 xyx@abc.com xyz
 tuv@abc.com tuv 
 lmn@abc.com lmn

моему скрипту bash необходимо прочитать файл, содержащий имена пользователей (по одному в каждой строке), и удалить соответствующую строку из виртуального файла. Итак, допустим, он считывает строку, содержащую имя пользователя xyz; таким образом, в примере ниже переменная $usr хранит значение 'xyz' .

 touch virtual.tmp
cat virtual | while read LINE ; do
if [ "$LINE" != "$usr@abc.com $usr" ] ; then
echo "$LINE" >> virtual.tmp
fi
done
rm -rf virtual
mv virtual.tmp virtual
  

Однако этот код не работает и, вероятно, неэффективен, поскольку все, что я хочу сделать, это удалить строку, основанную на имени пользователя. Предположительно, мне, возможно, не придется читать весь файл.

Ответ №1:

Попробуйте sed с помощью -i, например:

 sed -i -e "/^$usr@abc.com/d" virtual
  

это должно удалить строку из virtual, нет необходимости записывать во временный файл.

Комментарии:

1. немного не так; в моем примере это было бы sed -i -e «/^ $usr@abc.com $usr /d»виртуальный, но я понял суть этого — так что спасибо.

Ответ №2:

У вас есть файл с именами пользователей, которые нужно удалить, и файл (или поток) записей, содержащих имя пользователя. Идеальная ситуация для awk:

 awk '
  FNR == NR {user[$1]  ; next}
  !($2 in user) {print}
' users email_users > new_email_users