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
grep
GNU( 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
루프는 원하는 방식으로 작동합니다.