我正在编写一个BASH脚本,将我们公司的自定义Intranet与我们的postfix电子邮件服务器集成。在一种情况下,脚本必须从后缀虚拟文件中删除一行,该行采用以下格式(大部分):emailAddress username。
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
但是这段代码不起作用,可能效率不高,因为我想要做的就是删除一个基于用户名的行。据推测,我可能不必阅读整个文件。
答案 0 :(得分:6)
尝试使用-i进行sed,例如:
sed -i -e "/^$usr@abc.com/d" virtual
应从虚拟中删除该行,无需写入临时文件。
答案 1 :(得分:1)
您有要删除的用户名文件,以及包含用户名的记录文件(或流)。 awk的完美情况:
awk '
FNR == NR {user[$1]++; next}
!($2 in user) {print}
' users email_users > new_email_users