스크립트에서 고유한 출력을 얻는 데 문제가 있습니다.

스크립트에서 고유한 출력을 얻는 데 문제가 있습니다.

URL 목록(한 줄에 한 항목)이 포함된 파일이 있습니다.

호스트(서버) 이름을 추출하기 위해 아래 스크립트(올바르게 실행됨)를 사용하여 처리한 후 입력에 여러 번 나타나는 호스트 이름이 표시된 출력에 여러 번 나타납니다. 각 이름이 한 번만 나타나기를 원합니다. 나는 노력했지만 uniq도움 sort -u이 되지 않았습니다. 다음은 호스트를 추출하는 데 사용하는 코드입니다.

function extract_parts {
    if [ -f "wget-list" ]; then
        while read a; do
            a=${a:8}

            host=$(echo -e "$a"  | awk -F '/' '{print $1}' | sort -u)
          # host=$(echo -e "$a"  | awk -F '/' '{print $1}' | uniq -iu)

            echo -e ${host}

        done <<< $(cat ./wget-list)
    fi
}

여기에는 다음이 wget-list포함됩니다(잘린 예):

https://downloads.sourceforge.net/tcl/tcl8.6.12-html.tar.gz
https://downloads.sourceforge.net/tcl/tcl8.6.12-src.tar.gz
https://files.pythonhosted.org/packages/source/J/Jinja2/Jinja2-3.1.2.tar.gz
https://files.pythonhosted.org/packages/source/M/MarkupSafe/MarkupSafe-2.1.1.tar.gz
https://ftp.gnu.org/gnu/autoconf/autoconf-2.71.tar.xz
https://ftp.gnu.org/gnu/automake/automake-1.16.5.tar.xz

스크립트 이후의 결과(호스트만, 아니요 https://및 경로 부분):

downloads.sourceforge.net
downloads.sourceforge.net
files.pythonhosted.org
files.pythonhosted.org
ftp.gnu.org
ftp.gnu.org

원하는 출력(위이지만 반복되지 않음):

downloads.sourceforge.net
files.pythonhosted.org
ftp.gnu.org

답변1

while read a; do

당신은 한 줄을 읽고 있습니다 ...

host=$(echo -e "$a"  | awk -F '/' '{print $1}' | sort -u)

파이프에 인쇄한 다음 파이프를 정렬하고 파이프에서 고유한 행을 가져옵니다. 이것은 당신에게 독특한 경로를 제공할 것입니다.

그런 다음 완전히 분리된 다음 줄에서도 동일한 작업을 수행합니다.

대신 전체 파일을 파이프하면 됩니다.

$ < ./wget-list sed -e 's,^https://,,'  | awk -F/ '{print $1}' |sort -u
downloads.sourceforge.net
files.pythonhosted.org
ftp.gnu.org

답변2

grepGNU( Linux의 기본값) 가 있는 경우 다음을 사용하여 단순화할 수 있습니다.

extract_parts(){
    grep -oP 'https?://\K[^/]+' "$1" | sort -u
}

산출

$ extract_parts wget-list

downloads.sourceforge.net
files.pythonhosted.org
ftp.gnu.org

스크립트를 수정하세요

텍스트 조작이 잘못되었습니다. 고유한 행만 가져 https:와서 정렬하려고 합니다(이건 말이 안 됨).

작업 사본:

if [[ -f wget-list ]]; then
    while IFS= read -r line; do
        host=$(awk -F '/' '{print $3}' <<< "$line")
        echo "$host"
    done < ./wget-list | sort -u
fi

정렬해야ngbu전체 while루프는 원하는 방식으로 작동합니다.

관련 정보