• ベストアンサー

tail -f の出力に|(パイプ)を2回

tail -f の出力への|(パイプ)を2回行ったものの結果が出力されず困っています。 具体的には、下記のようなコマンドを実行しています。 tail -f hoge.txt | sed -e 's/aaaa//g' | grep 'moge' 2個目のsedのみにすれば問題なく出力されるのですが、最後のgrepを行うと何も出力されなくなってしまいます。(sedの結果がgrepに渡れば必ず出力されるはずのもの) |(パイプ)の仕組みの理解が曖昧な気がしているのですが、なぜこうなってしまうのかがわかる方がいらっしゃれば教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

バッファリングされているためでは無いですかね。 grep --line-buffered としてみてください。 まあ、お書きのコマンドなら、これと同じです。 tail -f hoge.txt | sed -n '/moge/s/aaaa//gp'

maenoina
質問者

お礼

どちらの方法でもできました。ありがとうございます! バッファリングについては理解できてないので、調べてみることにします。。

関連するQ&A

  • tail & grep の結果表示をリアルタイムに表示させる方法

    tail & grep の結果表示をリアルタイムに表示させる方法 現在以下のようなコマンドを実行しています。 tail -f ログファイル名 | grep -E "正規表現" | grep -E -v "正規表現" で、リアルタイムに表示してほしかったのですがだいぶ遅れてでないと出力されません。 正確にはいろいろ操作をしてログを多めに出さないと出力されないようです。 どうやら画面出力までにはバッファされているようです。 どこでバッファされているか分からないのですが、 とにかくタイムラグ無く(もしくは少なく)リアルタイムに出すようにしたいです。 tail & grep の結果表示をリアルタイムに出力する方法を教えてください。 よろしくお願いします。

  • パイプの使いかたについて

    linux初心者です。 パイプの使いかたについて教えて下さい。 パイプを使うことでパイプ前の結果をパイプ後に引きわたし、パイプ後にあるコマンドを実行できる、というようなことはネットで調べました。 ls -l | lessのような。。(ls結果をlessで表示する。) ここで質問なのですが、 grep photo | illust sample.txt としたとき、sample.txtのなかからphotoまたはillustに、マッチする行を抽出するという意味でよいのでしょうか? 自分で検証した限りではそのようにみえました。 ただ、そうだとしたとき、パイプの意味がよくわからなくなってしまいます。 パイプ前でコマンドを実行、その結果を引数にしてパイプ後でコマンドを実行するというように考えないほうがよいのでしょうか? すみませんが、使用方法について教えてください。

  • tailとgrepの組み合わせて、結果をファイルに出力について

    おせわになります。シェルの初心者です。 基本的なことかもしれませんが・・ tail -f test.log | grep -e TEST >> tailgrep.log のように、tailとgrepをパイプで連結した結果をファイルに書き出そうとしても、何も書き込んでくれません。 リダイレクトしなければ画面上にはちゃんと表示されますが、若しだめだったら、シェルなどで、解決方法をご存知でしたら、教えていただいて、助かります。

  • sedでの改行置換

    sedを用いた処理で質問があります。 出力結果の改行を置換して一列として表示しようとしているのですが、どうもうまくいきません。 (perlは敢えて使いません) 例えば、以下のようなファイルがあるとして、 $ cat hoge.txt hoge boo bar この出力結果を加工して、「hoge boo bar」のように、 改行をスペースに置換して一行として表示したい場合は、どのようにすれば良いでしょうか? ちなみに、以下のような使い方だと、うまくいきませんでした。 $ cat hoge.txt | sed 's/\ > / /g' $ cat hoge.txt | sed 's/\n/ /' ■実行環境 OS : RedHat EL 1 sedのバージョン : sed-4.0.7-3 宜しくお願い致します。

  • 出力各行の特定文字より左をパイプで渡す

    $ find /tmp -type f | sudo xargs grep -i ok /tmp/01.txt:ok wave /tmp/02.txt:ok wave /tmp/03.txt:ok wave それぞれの出力に対して txt より左をパイプで渡して gedit によりそのファイルを開き、 この例では3つのタブが開かれるようにしたいのですが、 どうすればよいでしょうか? よろしくお願いします。

  • findのexecdir内でパイプを使う

    現在シェルスクリプトを書いています。findの-execdirの中で次のコマンドを実行したいのですが、パイプをうまく取り扱ってもらうにはどうすればよろしいでしょうか。 tail -n +$[`sed -n "/^###END_OF_SCRIPT###$/{=;q;}" $0` + 1] $0 | tar xf - よろしくお願いします。

  • 多数あるファイル(text base)の*行目だけを引っ張ってきて標準出力させたい。

    Unix初心者です。 SunOS > head -1 ./*.txt とすれば、以下のように1行目だけを引っ張ってきて標準出力させる事も可能ですが。 ==> 1234.txt <== hello ==> 1235.txt <== hello SunOS > head -2 ./*.txt とすると、1行目と2行目が標準出力されます。 ==> 1234.txt <== hello bye ==> 1235.txt <== hello bye ですが、以下に例をあげますが、このように " 2行目だけ " を標準出力させたいのです。 ==> 1234.txt <== bye ==> 1235.txt <== bye sed -n '2p' ./*.txt だと、理由は不明ですが一つのファイルしか標準出力されませんでした。 head 、sed でなくともawk grepでも構いません。 その他の自分の知らないコマンドで構いません。 文字検索ではなく、*行目と行数指定です。 できれば、ファイル名も同時に出力させたいのです。 欲を言えば、行数も出力させたいです。 更に、翌を言えば、指定行を増やせたら最高です。 例;)1行目と3行目を標準出力する。 scriptを作りこまずに、|(パイプ)でつなげれば一行のコマンドで処理可能なのでは ないかと想像してますが、いかがでしょうか。 宜しく頼みます。

  • sed -f のエラー対策を、教えて下さい。

    sed -f work.sed hoge.txt を実行すると、"sed: 1: work.sed: bad flag in substitute command: 's'"となる。 work.sed(文字コード: utf8)の内容は、以下の通りです。 s/キーワード/文字/g 動作確認環境 ・Mac 10.5のターミナル ・サクラサーバーを、ターミナル上でリモート操作しました。 二つの環境で同じ動作でした。 これに対する対応策を、ご教示ください。

  • ExcelVBAでDOSコマンドの標準出力をリアルタイムでフォームへ出力するには

    いつもお世話になります。 タイトルにある通りです。 VBAより実行したDOSコマンドの実行結果を、tailコマンドのように、フォーム(テキスト部品など)に出力させたいと考えています。 一度実行結果をファイルへ保存してそれをフォームへ出力させる、というのではなく、あくまでリアルタイムで表示する、ということは可能でしょうか? よろしくお願いします。

  • SED スクリプトファイルを複数のファイルに作用させたい。

    SEDのスクリプトファイル(henkan.sed)を作りました。 このスクリプトを実行させたい対象ファイルが15個あります。(temp01.txt~temp15.txt) > sed -f henkan.sed temp01.txt > kekka01.txt > sed -f henkan.sed temp02.txt > kekka02.txt           ・           ・           ・ > sed -f henkan.sed temp15.txt > kekka15.txt これはあまりにもしんどいです。何かよい方法はあるでしょうか。 また、コマンドラインから一つのスクリプトファイルを複数の対象ファイルに作用させることは可能でしょうか。 よろしくお願いします。