在 bash 中多次读取 txt 文件(并行处理)

在 bash 中多次读取 txt 文件(并行处理)

这是一个用于 HTTP 状态代码的简单 bash 脚本

while read url
    do
        urlstatus=$(curl -o /dev/null --silent --head --write-out  '%{http_code}' "${url}" --max-time 5 )
        echo "$url  $urlstatus" >> urlstatus.txt
    done < $1

我正在从文本文件读取 URL,但它一次只能处理一个,花费了太多时间,GNU parallel 和 xargs 也每次处理一行(已测试)

如何处理同时进行的 URL 以改善时间安排?换句话说,使用 URL 文件线程而不是 bash 命令(GNU parallel 和 xargs 就是这么做的)

根据用户的回答,此代码运行良好,只是它不处理最后一个 url

urlstatus=$(curl -o /dev/null --silent --head --write-out  '%{http_code}' "${url}" --max-time 5 ) && echo "$url  $urlstatus" >> urlstatus.txt &

可能会添加等待帮助,,,任何建议

答案1

在 bash 中,您可以使用 & 符号在后台运行程序。示例

for i in {1..100..1}; do
  echo $i>>numbers.txt &
done;

编辑:抱歉,但评论中对你问题的回答是错误的,所以我只是编辑了答案。关于代码的建议

urlstatus=$(curl -o /dev/null --silent --head --write-out  '%{http_code}' "${url}" --max-time 5 ) && echo "$url  $urlstatus" >> urlstatus.txt &

答案2

GNU parallel 和 xargs 也一次处理一行(已测试)

你能举个例子吗?如果你使用,-j那么你应该能够同时运行多个进程。

我会这样写:

doit() {
    url="$1"
    urlstatus=$(curl -o /dev/null --silent --head --write-out  '%{http_code}' "${url}" --max-time 5 )
    echo "$url  $urlstatus"
}
export -f doit
cat input.txt | parallel -j0 -k doit

根据input.txt:

Input file is txt file and lines are separated  as
ABC.Com
Bcd.Com
Any.Google.Com
Something  like this
www.google.com
pi.dk

我得到输出:

Input file is txt file and lines are separated  as  000
ABC.Com  301
Bcd.Com  301
Any.Google.Com  000
Something  like this  000
www.google.com  302
pi.dk  200

看起来是正确的:

000 if domain does not exist
301/302 for redirection
200 for success

我必须说,如果您提供的输入行确实是您实际使用的输入的一部分,我会感到有点惊讶。这些域都不存在,并且带有空格的域名可能永远不会存在:

Input file is txt file and lines are separated  as
Any.Google.Com
Something  like this

如果您没有从实际输入文件中提供输入,那么您真的应该这样做,而不是编造东西 - 特别是如果编造的东西与真实数据不相似。

编辑

调试为什么它对您不起作用。

请不要编写脚本,而是直接在终端中运行:

bash # press enter here to make sure you are running this in bash
doit() {
    url="$1"
    urlstatus=$(curl -o /dev/null --silent --head --write-out  '%{http_code}' "${url}" --max-time 5 )
    echo "$url  $urlstatus"
}
export -f doit
echo pi.dk | parallel -j0 -k doit

这应该给出:

pi.dk  200

相关内容