vine-users ML アーカイブ



[vine-users:068986] Re: grepで 上書きエラー

  • From: "OOSATO,Kazzrou" <kazz@xxxxxxxxxxxxxx>
  • Subject: [vine-users:068986] Re: grepで 上書きエラー
  • Date: Tue, 30 Nov 2004 20:16:43 +0900
大里です。

# 今日はこんなネタがあったのか:)
# 乗り遅れですが。

> From: y_shiro@xxxxxxxxxxxxxxxx
> Subject: [vine-users:068976] Re: grepで上書きエラー
> Date: Tue, 30 Nov 2004 13:34:17 +0900

> 実際に、a、bのファイルを作成して試してみました。
>   $ grep test * > c
>   $ grep test * > c
> a、bの二つだけだとcには
> a、bの結果のみ出力されてcの結果はありませんでした。これは二番目のgrepを
> 起動したときにcのサイズが0となるためですね。grep test cの処理は行なわれる
> がサイズ0のため、結果もなしと。
> 
> > また、grepの出力はバッファリングされず、grep が出力したものはすぐにcに
> > 出力されるものとします。 ← ここが肝です。
> 
> もしa、bにtestと記述されている行がgrepのバッファ以上に大きければ、
>   1) cにa、bの結果がバッファを溢れて反映
> 	↓
>   2) grep test で cが検索対象となる(cには、すでにバッファ以上の内容が入っている)
> 	↓
>   3) cにc自身の結果が追記
> 	↓
>   4) cに追記された内容がさらにgrepが検索、バッファを溢れcに追記
> 	↓
>   以後3)と4)の繰り返しで処理が終わらない

  ふむふむ、c の読み込み処理に入ったときに、その前のファイルの 
grep で c に書きこまれているデータのサイズがファイルシステムの
ブロックサイズ(4kB)を超えているかどうかが、終了とループの分かれ
目になりそうですね。
  c の最初の読み込みで EOF を検出できないから close せずに処理
して書き込みを行なう。このケースでは c に書きこまれているデー
タは全件マッチするから、もう永遠に EOF には追いつけない。
  これが 4kB 以内に EOF がみつかれば無事終了。

$ grep X-Miler [1-9]* > x-mailer.txt
で無問題なんですけどね。

-- 
  kazz