附加时删除重复

时间:2014-06-17 15:33:02

标签: bash shell sorting uniq

我正在考虑为用bash编写的实用程序创建一个历史文件。此文件是最近服务器地址的记录。我会在其中添加新地址(每行一行),但我不想要重复。

因此,如果文件现在是:

dept4.abc.edu
dept3.abc.edu
dept2.abc.edu
dept1.abc.edu

现在,如果我要追加dept3.abc.edu到最后,我不想要它,

dept4.abc.edu
dept3.abc.edu
dept2.abc.edu
dept1.abc.edu
dept3.abc.edu

相反,我希望它是,

dept4.abc.edu
dept2.abc.edu
dept1.abc.edu
dept3.abc.edu

sort file | uniq在这种情况下不起作用,因为我想保留最新的服务器地址。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

FILE=<path-to-history-file>
SERVER=<name-of-the-server-to-add/refresh>

# remove any previously entered occurence
sed -i "/$SERVER/d" $FILE

# append
echo $SERVER >> $FILE

答案 1 :(得分:1)

随时随地追加。不要在重复删除过程中同步阻止此操作。每次要写入历史记录时搜索和覆盖整个文件都是一项昂贵的操作。

printf '%s\n' dept3.abc.edu >> histfile

然后,按计划清理重复项而不破坏(反向)订单。作为一个典型的例子:

cp histfile histtmp
> histfile
tac histtmp | awk '!s[$0]++' | tac >> histfile

tac反面为cat。如果您没有,则可以使用tail -r。)

以上内容将清理重复项,并最大限度地减少更新文件和丢失清理期间添加的任何新历史记录项之间的竞争。您可以将后一部分添加到您的个人cron中,例如,每隔10分钟清理一次历史记录:

*/6 * * * * ~/histclean