2018年3月8日木曜日

【Linux】コマンドのプログレス表示(リアルタイム表示)を加工する

■CentOSの場合
./progress.sh | xargs -n 1 -d '¥x0D' | sed -u "s/copied/【copy progress report】/g" | awk -v ORS="¥r" '{print;}'

■Ubuntuの場合(CentOSでもできるかも)
./progress.sh | xargs -n 1 -d '\x0D' | sed -u "s/copied/【copy progress report】/g" | ruby -pe 'sub("\n", "\r")'

■加工内容の変更
sedの引数を変更すると加工内容を変更できる。 -eで正規表現使用可能。
上記では、copiedを【copy progress report】に変換している。

■補足
・sedだけいけると思いきや、プログレス表示は、CRしか来ないのでsedが実行されない。sedはLFを待ってから実行されるみたい。そのため、xargsでCRが来る度にパイプ先に渡すようにする。次にsedで加工。xargsでLN改行したので、最後にawkやrubyでCRに戻す。
・awkやrubyのバージョン、Linuxの種類によって、できたりできなかったりする。

◆例) 以下のようなprogress.sh(中身はかなりテキトー)があったとする。
#!/bin/bash

for i in `seq 1 100`; do
  complete=`expr ${i} \* 10`
  echo -en "copied $complete/1000KB (${i})%\r"
  sleepenh 0.1 > /dev/null
done
echo
※Ubuntuでしかもsudo apt install sleepenhが必要。CentOSの場合はusleepに読み替えること。

このprogress.shを実行すると、以下のように表示される。

加工コマンドをかますと、以下となる。


0 件のコメント:

コメントを投稿