2012-03-23 20 views
17

プログラムsedawkは通常、静かに作業します。これらのプログラムに自分が行っていることを述べる方法はありますか?sedとawkからの冗長な進捗の印刷

sed -e '...' input.txt | pv > output.txt 

あなたが使用することができます:あなたは、ファイルへのsedまたはawkの出力をリダイレクトする(の代わりに、その場でファイルを変更する)あなたは(「パイプビューア」)ショットをpvを与えることができている場合は

答えて

4

pv -lを使用して、書き込まれた行の進捗状況を報告します。進行状況はstderrに、実際のデータはstdinからstdoutに変わります。

4

あなたは常にデフォルトはそれぞれの行を印刷することで、けれどもあなたは、それぞれの行を印刷する「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を伝えることができます。何かのように

私はこれが役立ちます。

5

これは(SEDのために)あなたのために働くかもしれない:

sed -i 's/foo/bar/;w /dev/stdout' files* 
+0

元のコマンドの-iはOS Xでは動作しません。-eがありませんか? OS Xのためにsedを使用して働いた例: – Paul

+0

ポールのコメント '$エコーこんにちは>テスト $ sedの-eさん/ LL/ZZ /; Wは/ dev/stdoutを「-i .backupテスト hezzo $猫テスト hezzo $ cat test.backup hello' – StuartLC

+1

Paul:Mac OS Xは、BSDバージョンのsedを使用しています。これは、Linuxシステムでよく見られるGNUバージョンとはいくつかの点で異なる働きをします。 BSD sedでは、-iには* some *拡張子を指定する必要がありますが、GNU sedは空文字列として何も解釈しません。 GNU sedの 'sed -i'に相当するBSD sedは単に' sed -i '''です。 StuartLCの例は、ファイルを編集していない(つまり、長さがゼロでない拡張子を使用しているため、この小さな違いには対応しないため)どちらのバージョンでも同じ動作をします。 – robo

3

あなたがLinux上である場合は、/proc/<pid>/fdinfoに調べることで、大容量ファイルを処理しているプロセスの進捗状況を表示することができます。開いているファイルディスクリプタごとにエントリがあります。エントリをキャッチすると、ファイルディスクリプタの読み書き位置が表示されます。あなたはファイルに1123456バイトであることがわかります。開いているファイルのパス名は別の領域にあります:/proc/<pid>/fd、シンボリックリンクとして表されます。

私はそれを見る前に、通常straceをプロセスに添付します:strace -p <pid>。これを使用して、プロセスがどのシステムコールを行っているかを見ることができます。ファイルの読み書き、メモリ割り当てはbrkまたはmmapです。

+0

便宜上、 'ps ax | grep foo'ここで、 'foo'は問題のプログラムの名前で、上記で使用するプロセスIDを見つけるために使用できます。 –

5

sedの出力をファイルにパイプしていると仮定して、tailコマンド(別のターミナルで)を使用してファイルの終わりを常に調べることができます。あなたが進歩を見ることができるように。

tail -f output_from_sed.txt 
2

これはあなたが探しているものと正確ではないかもしれませんが、他の人を助けるかもしれません。 FWIW:
gawk -W dump-variables=/tmp/awk.log
は、スクリプトの最後の変数値をログファイルにダンプします。

7

これは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 
+2

より新しいsedのバージョンでは、wが省略される前のセミコロンが省略された場合、wは "s" sedコマンドの引数になり、変更のみが/ dev/stdoutに書き込まれます。 – Jack

0

「右」、ここで答えです

pv myfile.txt | sed ... 

エドゥアルドIvanecの答えは接戦だったが、実際の配管を行うには、パイプビューア(PV)を使用することによって、あなたはあなたの進歩が何であるかを知ってもらいます(M /秒、合計データなどのような大きな統計を含むパーセンテージとして)。catよう

pv作品(ファイルを読み込み、stdoutに直接エクスポートする、または内の配管の場合には、それはstdinstdoutの間のブリッジです)。

重要なことに、pvは「透過パイプ処理」であるため、stdoutは中継データで占有されています。したがって進捗報告はstderrによって報告されます。

+0

これはインプレース置換では機能しません。(AFAIK) – starryknight64

関連する問題