'dd'からawk/sed/grepに出力を送信する

'dd'からawk/sed/grepに出力を送信する

私のコンピュータの書き込み速度を推定するためにddを使用しようとしています。

dd if=/dev/urandom of=/dev/null bs=1K count=10000

次の出力を提供します

10000+0 records in
10000+0 records out
10240000 bytes (10 MB) copied, 0.746313 s, 13.7 MB/s

bash変数に「13.7MB / s」をどのように入れますか? ddの出力をawk、sed、grepなどのプログラムにパイプで接続してみましたが、役に立ちませんでした。

os.system(...)最終的にPythonスクリプトを介して呼び出します。 Pythonで同様の結果を得るためのより直接的な方法を知っている人がいれば、私もその方法に興味があるでしょう。ファイルサイズに基づいてファイルのコピーにかかる時間を予測しようとしています。

どんな助けでも大変感謝します。

答え1

問題は。STDERR代わりに dd の出力を指定して 。それだけでなく、STDOUTリダイレクトも行う必要があるということです。STDERRSTDOUT

|&bashとzshの場合、これを代わりに使用できます。これは2番目のコマンドにも|リダイレクトされます。例:STDERRSTDIN

dd if=/dev/urandom of=/dev/null bs=1K count=10000 |& awk '/copied/ {print $8 " "  $9}'

より一般的なアプローチは、STDERRの明示的なリダイレクトを使用することです2>&1。たとえば、次のようになります。

dd if=/dev/urandom of=/dev/null bs=1K count=10000 2>&1 | awk '/copied/ {print $8 " "  $9}'

Python部分の場合は、サブプロセスモジュールを確認してくださいPopen特に。

答え2

var=$(dd if=/dev/urandom of=/dev/null bs=1K count=10000 2>&1)
var=$(echo ${var##*,})

答え3

打撃後パラメータ拡張1_CRで提案された優れたエレガントなソリューションである外部コマンドを使用しないでください。

しかし、彼の提案は間違った値を返します(つまり、コンマの後の値のみを返します)。

$ var=$(dd if=/dev/urandom of=/dev/null bs=1K count=10000 2>&1)
$ var=$(echo ${var##*,})
$ echo $var
8 MB/s # the wrong value

次の正解が提供されます。

$ var=$(dd if=/dev/urandom of=/dev/null bs=1K count=10000 2>&1)
$ var=$(echo ${var##*s,})
$ echo $var
11,8 MB/s # the right value

答え4

テーマの別のバリエーションとして、関連するすべてのフィールドを取得し、awkまたはsedへの外部呼び出しを避けます(bashに組み込まれた読み込みを使用)。

IFS=' +' read in_full in_part _x _x \
out_full out_part _x _x \
bytes _x _x _x _x seconds _x speed speed_units < <(
  echo $(dd if=/dev/zero of=/dev/null bs=1024 count=7 2>&1) 
)

echo -e "$bytes bytes were read in $seconds seconds, speed was $speed $speed_units.\n$in_full full blocks, and $in_part partial blocks were read in.\n$out_full full blocks, and $out_part partial blocks were written out."

1行に同じ内容がある(\改行を除く)

IFS=' +' read in_full in_part _x _x out_full out_part _x _x bytes _x _x _x _x seconds _x speed speed_units < <( echo $(dd if=/dev/zero of=/dev/null bs=1024 count=7 2>&1) )
echo -e "$bytes bytes were read in $seconds seconds, speed was $speed $speed_units.\n$in_full full blocks, and $in_part partial blocks were read in.\n$out_full full blocks, and $out_part partial blocks were written out."

関連情報