時々、プログラムの出力がデフォルトで自分自身を上書きすることがあります。
たとえば、 の出力にはdd if=(something) of=(something) status=progress
次の出力モデルがあります。
56670413312 bytes (57 GB, 53 GiB) copied, 1938 s, 29.2 MB/s
そして、新しい行を印刷せずに値が変更され続けます(したがって、出力はそれ自身を上書きします)。
次のスクリプトを使用してこの動作を複製しました。
#!/bin/sh
# POSIX!
limit=50
i=1; while [ $i -le $limit ]; do
echo -n "testing $i\r"
i=$(($i + 1))
done
したがって、毎秒追加の行を印刷(追加)せずに、次の行が現在の数字に置き換えられます。
testing <number>
問題は、この出力を継続的に観察して情報を解析して処理する方法です。
たとえば、私はddの出力を取得し、何らかの方法で解析して特定の割合の結論を得たいと思います。似ている:
# This is the output model:
# 56670413312 bytes (57 GB, 53 GiB) copied, 1938 s, 29.2 MB/s
# Parsing the output
dd if=/dev/sda1 of=/dev/sdb1 status=progress | awk '{print $3}' | cut -d '(' -f 2 | awk '{print $1"GB concluded of 10000GB"}'
私は少なくとも印刷行の追加内容を表示したいと思いました。
1GB concluded of 10000GB
2GB concluded of 10000GB
...
しかし、代わりに何も起こらず、パイプから出力を完全に無視します。
このような場合、ddの出力を再現するには、上記のスクリプトをモデルとして使用できます。
#!/bin/sh
limit=50
i=1; while [ $i -le $limit ]; do
echo -n "56670413312 bytes ($i GB, 53 GiB) copied, 1938 s, 29.2 MB/s\r"
i=$(($i + 1))
sleep 1
done
私が望む方法で一貫して出力を解析するにはどうすればよいですか? (好ましくはPOSIXで)