我有一个包含 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
如果您有 GNU (grep
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
排序应该恩格布整个while
循环按照你想要的方式工作。