我尝试使用正确的语法来存储域。但我没有得到正确的输出。以下是我所做的以及我得到的结果,并且这个命令卡住了:
while read -r url; do noprefix=${url#*//}; nosuffix=${noprefix%%/*}; echo "$nosuffix"; done < FinaleOutput.txt > First.txt
msn.com.jp
msn.com.jp
msn.comjswartout
msn.comjubas
msn.com.junk
msn.comk
msn.com...kugoo
msn.comlamer6
msn.comlcrane
msn.comleonardpj49
msn.comlinkbobber
msn.comm
msn.comm.
我如何编写一个验证命令,以便根据语法为我提供正确的域。
所需输出的示例:
google.com.tk
www.google.co.uk.se
google.co.au
www.google.co.uk.se
m.google.com
www.google.com
如果输入如下:
google.com.tkmn/1/2/3/
www.google.co.uk.seas
google.co.au___travel
www.google.co.uk.se/1/2/
m.google.com--tour
http://www.google.com/au
答案1
以下脚本基于删除尾随字符并根据nslookup
DNS 服务器的查询验证结果字符串进行操作:
#!/bin/bash
find_correct_domain(){
local string="$1"
while ! nslookup "$string" &> /dev/null
do
string="${string%?}"
done
echo "$string"
}
main(){
local new_line=""
while IFS= read -r line
do
case "$line" in
http*) new_line=${new_line##*/} ;;
*) new_line="$line";;
esac
find_correct_domain "$new_line"
done < "$1"
}
main "$@"
使用OP提供的输入文件,结果输出如下:
$ ./format_domains.sh input.txt
google.com.
www.google.co.uk.se
google.co.
www.google.co.uk.se
m.google.com
m.google.com
google.com.
请注意,DNS查询末尾的尾随点google.co.
(即nslookup
执行的)都以点结尾,除非您自己这样做,因此google.com.
是有效的DNS查询(根据RFC 1034)。有关详细信息,请参阅此文章:http://www.dns-sd.org/trailingdotsindomainnames.html
如果不希望有尾随点,则可以向函数case
中添加简单的语句find_correct_domain
来将其删除,如下所示:
find_correct_domain(){
local string="$1"
while ! nslookup "$string" &> /dev/null
do
string="${string%?}"
done
case "$string" in
*.) string="${string%?}";;
esac
echo "$string"
}
当然,请记住,此脚本并未针对性能进行优化:它在所有项目上完成bash
并执行,nslookup
因此运行时间可能是 O(n 2)类型,这意味着如果您有一个大列表,它可能会运行缓慢,但对于相对较小的列表来说没问题。