如何验证文件中的域语法?

如何验证文件中的域语法?

我尝试使用正确的语法来存储域。但我没有得到正确的输出。以下是我所做的以及我得到的结果,并且这个命令卡住了:

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

以下脚本基于删除尾随字符并根据nslookupDNS 服务器的查询验证结果字符串进行操作:

#!/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)类型,这意味着如果您有一个大列表,它可能会运行缓慢,但对于相对较小的列表来说没问题。

相关内容