如何从文件中删除给定的行

时间:2011-05-12 23:50:04

标签: bash

我正在编写一个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

但是这段代码不起作用,可能效率不高,因为我想要做的就是删除一个基于用户名的行。据推测,我可能不必阅读整个文件。

2 个答案:

答案 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