我有一个公共dns列表(在一个名为dns.test的文件中(。它的一些元素似乎无法解析。我需要消除它们。这是文件:
199.255.137.34
103.112.162.165
103.133.222.202
82.146.26.2
94.236.218.254
185.81.41.81
103.209.52.250
119.160.80.164
8.8.8.8
8.8.4.4
151.80.222.79
注意:没有空格、尾随空格或标题空格。
我做了一个片段,逐一检查并删除有缺陷的:
while IFS='n' read -r LINE;do dig +short +timeout=1 serverfault.com @${LINE} &>/dev/null;[[ $? -eq 0 ]] && echo "${LINE} -> OK" || { echo "${LINE} -> NOK";sed -i "s/${LINE}//g" dns.test; };done< <(cat dns.test)
我缩短了暂停时间,否则太慢了!
但是sed部分不起作用;我将代码片段的sed部分建立在以下测试的基础上:
LINE=199.255.137.34;sed -i "s/${LINE}//g" dns.test #-> this works manually but not when included in the script.
谢谢大家!!
此任务不需要使用sed
。只需打印出工作的dns服务器的地址,并用输出替换原始文件的内容。你可以试试这个:
while read -r ipaddr; do
dig +short +timeout=1 serverfault.com @"$ipaddr" &>/dev/null && echo "$ipaddr"
done < dns.test > working-dns.test
以及如果CCD_ 3的内容看起来良好则为CCD_。
下面的代码应该可以工作,请注意char'<'的用法和">"。
LINE="199.255.137.34";sed -i "/<$LINE>/d" dns.test