在脚本中获取唯一输出的问题

在脚本中获取唯一输出的问题

我有一个包含 URL 列表的文件(一行一个条目)。

使用下面的脚本(正确运行)处理它以提取主机(服务器)名称后,在输入中多次出现的主机名在显示的输出中多次出现。我希望每个名字只出现一次。我尝试过uniqsort -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 (grepLinux 上的默认设置),您可以使用以下命令进行简化:

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循环按照你想要的方式工作。

相关内容