0

我想知道是否有一种方法可以删除需要特定格式的主机文件中的任何重复行。这是一个例子,我的意思是第一部分必须单独放置,但第二部分需要每一行与所有其他行相比,并删除重复项哦,文件很大,几乎 1GB。

同样使用任何人建议的脚本,我可以使用 ping 检查第二部分中的每一行是否存在于 Internet 上,如果不存在则删除并将所有这些编辑的信息放入新的文件名中。

{FIRST PART}  {SECOND PART}
 127.0.0.1        WWW.BLAHDOTTEST,COM
 127.0.0.1        WWW.HHHHHH.COM 
 127.0.0.1        WWW.JJJJJJ.COM
 127.0.0.1        WWW.PPPPPPP.COM
 127.0.0.1        WWW.BLAHDOTTEST,COM
 127.0.0.1        WWW.HHHHHH.COM 

所以新文件看起来像这样,假设所有这些地址都是有效的。

{FIRST PART}  {SECOND PART}
 127.0.0.1        WWW.BLAHDOTTEST,COM
 127.0.0.1        WWW.JJJJJJ.COM
 127.0.0.1        WWW.PPPPPPP.COM
 127.0.0.1        WWW.HHHHHH.COM 

谢谢你的时间。

4

1 回答 1

1

当然。

sort -u /etc/hosts > /tmp/hosts.new && mv /tmp/hosts.new /etc/hosts

这是假设您知道您在控制机器,并且没有其他用户会篡改 /tmp 中的文件。

至于 ping:这是不可能的,因为您的主机文件中有它们指向环回接口。主机中的任何内容都将始终有效。(除非你把 lo 拆掉,在这种情况下 ALL 都会失败。)

如果您可以在几分钟内不使用时髦的大型 hosts 文件,则可以将其 mv 移开(留下系统相关条目),并且如果已经删除了骗子,则可以做如下天真的事情:

作为您自己的用户,请执行以下操作:

vi cleaner
i
<copy & paste script now>
ESC
:wq
chmod +x cleaner
cp /etc/hosts .
./cleaner

完成后,查看 newfile(在您的家中)。如果您对此感到满意,请将其复制到 /etc/hosts

sudo cp newfile /etc/hosts

这是进入清洁器的内容:

#!/bin/bash
while read line
do
  IP=$( echo $line| awk '{print $2}' )
  if $( ping -c 1 -W 2 $IP >> errors 2>&1 ); then
    echo $line >> newfile
  fi 
done < hosts

PS:如果你要维护一个 Linux/Unix 机器,那么是时候学习一些基础知识了。

于 2013-04-28T18:03:29.323 回答