6

awk (gawk) に見つからないファイルを無視またはスキップさせる方法はありますか? つまり、ファイル システムに存在しなくなった、コマンド ラインで渡されたファイルです (たとえば、/proc/[1-9]* の下で急速に出現/消失するファイル)。

デフォルトでは、見つからないファイルは致命的なエラーです:-(

次のようなことと同等のことができるようにしたいと思います。

BEGIN { MISSING_FILES_ARE_FATAL = 0 }  # <- Wishful thinking!
      { count++ }
END   { print count }

ラッパー スクリプトは、awk が実行される前にファイルが存在することを確認できません。これは、ファイルがチェックされてから awk がファイルを開こうとするまでの間にファイルが消える可能性があるためです。つまり、競合状態です。(タイミングはタイトですが、awk内でチェックしてから開くことも競合状態です)

4

6 に答える 6

2

GAWK 4 には、空でない場合(ファイルを開くことができなかったことを示す) をBEGINFILEテストして実行できる機能があります。ERRNOnextfileERRNO

于 2012-09-10T11:22:57.233 に答える
1

awk スクリプトに perl または shell ラッパーを貼り付けても、競合状態が発生すると思います。たとえば、ADEpt のそれ以外の点では優れたシェル スニペットを使用すると、次のようになります。

[ -r "$filename" ] && awk -f ... $filename

-r と awk がファイルを開こうとするまでの間、プロセスが終了するのを妨げるものは何もありません...

私が考えることができる唯一の答えは、LD_PRELOAD を使用して awk のシステム オープン コールを置き換えることです。これにより、ファイルが見つからない場合、代わりに /dev/null の読み取りファイル記述子が開かれます。

それはうまくいくかもしれません...

于 2008-10-20T09:35:57.583 に答える
1

の内容をシステム コールで確認し、ARGVを介して処理できますgetline

 if (system("test -r " ARGV[1]) == 0)
   while ( (getline aline < ARGV[1]) >0 )
     # process ARGV[1] via `aline` instead of $0

...

次に、ARGV[2] などの HTH を処理します。

于 2008-10-20T09:48:51.723 に答える
1

「MISSING_FILES_ARE_FATAL = 0」機能は、次の gawk リリースの一部になるようです。現在の gawk 安定ソース コードの ChangeLog ファイルを参照してください。

- - をちょきちょきと切る - -

金 8 月 22 日 14:43:49 2008 アーノルド D. ロビンス

* io.c (nextfile): Users Strong In The Ways Of The Source can use
non-existant files on the command line without it being a fatal error.

- - をちょきちょきと切る - -

http://cvs.savannah.gnu.org/viewvc/gawk-stable/ChangeLog?revision=1.87&root=gawk&view=markup

ヘルマン

于 2009-01-07T13:06:26.780 に答える
0

最高の伝統の中で、私はあなたのawkの質問にPerlプログラムで答えます。

#!/usr/bin/perl -w

for my $file (@ARGV) {
    open my $fh, $file or next;
    while(<$fh>) {
        ...do your thing here...
    }
}

(これは問題ではありませんが、競合状態のない唯一の解決策です。)

于 2008-10-20T01:05:39.627 に答える
0

あ、ごめんなさい。私の以前の回答は無視してください。ここに別の提案があります:

cat /proc/[1-9]* 2>/dev/null | awk ....

Cat は、欠落しているファイルも存在するファイルもすべてむさぼり食い、cat のエラーは無視され (欠落しているファイルは cat にとって致命的ではないエラーです)、awk は結果を処理できるようになります。

于 2008-10-21T22:14:29.783 に答える