#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