forループを使用してtxtファイルを解析するときの進行状況インジケータ

forループを使用してtxtファイルを解析するときの進行状況インジケータ

DNSサーバーをテストし、結果をcsvファイルに返すために非常に単純なスクリプトを作成しようとしています。うまくいきますが、大規模なドメインソースファイルの場合は時間がかかります。

pvまたはawkを使用して進行状況インジケータを作成する方法はありますか?

#!/bin/bash
# File name of domain list: One FQDN per line in file.
domain_list='domains.txt'
#
# IP address of the nameserver used for lookups:
ns1_ip='1.1.1.1' # Cloudflare
ns2_ip='9.9.9.9' # Quad9
#
# Seconds to wait between lookups:
loop_wait='1'
#
echo "Domain name, $ns1_ip,$ns2_ip" > dns-test-results.csv;
for domain in `cat $domain_list`
do
    ip1=`dig @$ns1_ip +short $domain |tail -n1`; 
    ip2=`dig @$ns2_ip +short $domain |tail -n1`;
    echo -en "$domain,$ip1,$ip2\n" >> dns-test-results.csv;
# 
done;


ベストアンサー1

まず、アイテムを配列に保存して数を計算し、各ループ反復で処理されたアイテム数と合計アイテム数を印刷できます。

たとえば、次のようになります。

items=( $(cat items.txt) )
i=0; for x in "${items[@]}"; do
    printf "\r%d/%d" "$(( i += 1 ))" "${#items[@]}";
    sleep 1  # do some actual work here
done
echo

しかし、トークン化に頼るのは$(cat file...)少し問題があるので、以下をreadarray使用して各入力ファイルを配列要素として読み取る方が安全です。

readarray -t items < items.txt

おすすめ記事