Как я могу проверить доменный синтаксис в файле?

Я попробовал сценарий для хранения доменов правильным синтаксисом. Но я не сделал получил надлежащий вывод. Вот то, что я сделал и что я получил, и также эта команда застряла:

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
-2
задан 1 February 2017 в 06:34

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. и google.co. Запросы DNS (который является что 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 (n2) тип времени выполнения, что означает, что, если у Вас есть большой список, это, вероятно, отстанет, но для относительно маленьких списков он прекрасен.

2
ответ дан 7 November 2019 в 01:46

Другие вопросы по тегам:

Похожие вопросы: