プログラムsed
とawk
は通常、静かに作業します。これらのプログラムに自分が行っていることを述べる方法はありますか?sedとawkからの冗長な進捗の印刷
sed -e '...' input.txt | pv > output.txt
あなたが使用することができます:あなたは、ファイルへのsed
またはawk
の出力をリダイレクトする(の代わりに、その場でファイルを変更する)あなたは(「パイプビューア」)ショットをpv
を与えることができている場合は
プログラムsed
とawk
は通常、静かに作業します。これらのプログラムに自分が行っていることを述べる方法はありますか?sedとawkからの冗長な進捗の印刷
sed -e '...' input.txt | pv > output.txt
あなたが使用することができます:あなたは、ファイルへのsed
またはawk
の出力をリダイレクトする(の代わりに、その場でファイルを変更する)あなたは(「パイプビューア」)ショットをpv
を与えることができている場合は
pv -l
を使用して、書き込まれた行の進捗状況を報告します。進行状況はstderr
に、実際のデータはstdin
からstdout
に変わります。
あなたは常にデフォルトはそれぞれの行を印刷することで、けれどもあなたは、それぞれの行を印刷する「P」CMDを使用して、SED付きすなわち
awk '{
print "#dbg:$0="$0
# do more stuff
print $1
# or make it conditional
if ($0 ~ /specialRegEx/){
print "#dbg:$0="$0
}
}' infile
、入力レコードを印刷するのawkを伝えることができます。何かのように
私はこれが役立ちます。
これは(SEDのために)あなたのために働くかもしれない:
sed -i 's/foo/bar/;w /dev/stdout' files*
あなたがLinux上である場合は、/proc/<pid>/fdinfo
に調べることで、大容量ファイルを処理しているプロセスの進捗状況を表示することができます。開いているファイルディスクリプタごとにエントリがあります。エントリをキャッチすると、ファイルディスクリプタの読み書き位置が表示されます。あなたはファイルに1123456
バイトであることがわかります。開いているファイルのパス名は別の領域にあります:/proc/<pid>/fd
、シンボリックリンクとして表されます。
私はそれを見る前に、通常strace
をプロセスに添付します:strace -p <pid>
。これを使用して、プロセスがどのシステムコールを行っているかを見ることができます。ファイルの読み書き、メモリ割り当てはbrk
またはmmap
です。
便宜上、 'ps ax | grep foo'ここで、 'foo'は問題のプログラムの名前で、上記で使用するプロセスIDを見つけるために使用できます。 –
sedの出力をファイルにパイプしていると仮定して、tailコマンド(別のターミナルで)を使用してファイルの終わりを常に調べることができます。あなたが進歩を見ることができるように。
tail -f output_from_sed.txt
これはあなたが探しているものと正確ではないかもしれませんが、他の人を助けるかもしれません。 FWIW:
gawk -W dump-variables=/tmp/awk.log
は、スクリプトの最後の変数値をログファイルにダンプします。
これはpotongの答えに基づいています。次のコードは、 'll'を 'zz'に置き換え、バックアップファイルを作成し、新しいテキストを表示し、その変更をファイルに書き込みます。
$ echo hello > test
$ sed -e 's/ll/zz/;w /dev/stdout' -i .backup test
hezzo
$ cat test
hezzo
$ cat test.backup
hello
より新しいsedのバージョンでは、wが省略される前のセミコロンが省略された場合、wは "s" sedコマンドの引数になり、変更のみが/ dev/stdoutに書き込まれます。 – Jack
「右」、ここで答えです
pv myfile.txt | sed ...
エドゥアルドIvanecの答えは接戦だったが、実際の配管を行うには、パイプビューア(PV)を使用することによって、あなたはあなたの進歩が何であるかを知ってもらいます(M /秒、合計データなどのような大きな統計を含むパーセンテージとして)。cat
よう
pv
作品(ファイルを読み込み、stdout
に直接エクスポートする、または内の配管の場合には、それはstdin
とstdout
の間のブリッジです)。
重要なことに、pv
は「透過パイプ処理」であるため、stdoutは中継データで占有されています。したがって進捗報告はstderr
によって報告されます。
これはインプレース置換では機能しません。(AFAIK) – starryknight64
元のコマンドの-iはOS Xでは動作しません。-eがありませんか? OS Xのためにsedを使用して働いた例: – Paul
ポールのコメント '$エコーこんにちは>テスト $ sedの-eさん/ LL/ZZ /; Wは/ dev/stdoutを「-i .backupテスト hezzo $猫テスト hezzo $ cat test.backup hello' – StuartLC
Paul:Mac OS Xは、BSDバージョンのsedを使用しています。これは、Linuxシステムでよく見られるGNUバージョンとはいくつかの点で異なる働きをします。 BSD sedでは、-iには* some *拡張子を指定する必要がありますが、GNU sedは空文字列として何も解釈しません。 GNU sedの 'sed -i'に相当するBSD sedは単に' sed -i '''です。 StuartLCの例は、ファイルを編集していない(つまり、長さがゼロでない拡張子を使用しているため、この小さな違いには対応しないため)どちらのバージョンでも同じ動作をします。 – robo