bashでfold整形後のリダイレクト方法について

このQ&Aのポイント
  • bashでのexecコマンドのリダイレクト方法について質問があります。execコマンドでのログ出力を整形してリダイレクトしたい場合、foldコマンドを使用することができますが、ファイル出力した場合に全てのログが出力されない問題が発生しました。リダイレクトされたファイルに標準出力と同期して全てのログを出力させる方法はありますか?
  • bashでのexecコマンドのリダイレクト方法について質問があります。foldコマンドを使用してログの整形を行った後、ファイルにリダイレクトするとログの一部が欠けてしまいます。全てのログをファイルに出力させる方法はありますか?
  • bashでのexecコマンドのリダイレクト方法についてアドバイスをいただきたいです。ファイルへのリダイレクト時にログが途中で切れてしまい、全てのログが出力されません。ログを完全にファイルに出力させる方法はありますか?
回答を見る
  • ベストアンサー

bashでfold整形後のリダイレクトについて

bashのスクリプトについて質問させてください。 現在、サーバプログラムexecの起動とログ出力を以下のコマンドで実行しております。 exec > server.log しかし、execの出力行の中に、server.logをviで開くことができないような、文字数の多い行が出力されるようになったため 整形してリダイレクトしたいと考えております。そこで exec | fold -w 256 としたところ、exec起動時のログが整形されて正しく標準出力されました。 しかし、これを下記のようにリダイレクトしてファイル出力した場合、起動時のログが尻切れとなり、最後まで出力されませんでした。 exec | fold -w 256 > server.log 起動後にサーバに接続し、以降のサーバーログを出力させると、尻切れから先が出力されはしたのですが、 現在、起動後にserver.logを確認すると最終行の「server startup OK」という文字が確認できない、という状況になっております。 リダイレクトされたファイルにも、標準出力と同期して最終文字まで出力させる方法はございますでしょうか? よろしくお願いいたします。

  • MK666
  • お礼率100% (12/12)

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.2

意味が最初わからなかったのですが、execとお書きなのはシェルの組み込みコマンドのexecでなくて、実際にはexecではないプログラム名称を書き換えてexecとお書きなのですね。 (例示であればfooだとかhogeだとかの方が良いです) No1の方がお書きのようにバッファリングの問題であるなら(プログラムを終了させるとちゃんとファイルに出力されるのなら)、バッファリングしない(もしくは行単位でバッファリングする)プログラムを使うしか無いですね。 OSは何でしょう?Linuxではなさそうですが。 折り返しだけなら自分でCでプログラムを書くというのもありそうです。 あとは、そのままファイルに書いて、viで開く前にfoldするとか。

MK666
質問者

お礼

教えてgooの操作になれておらず、補足に入力しておりました。すいません。 回答ありがとうございました。

MK666
質問者

補足

回答ありがとうございます。 > 例示であればfooだとかhogeだとかの方が良いです ご指摘ありがとうございました、以降気をつけます。 > OSは何でしょう? HP-UX 11.31です。 > バッファリングしない(もしくは行単位でバッファリングする)プログラムを使うしか無いですね。 perlで以下のようなプログラムを挟むことで、バッファリングを回避してログ出力することができました。 exec | perl -ne '$|=1;while(<STDIN>){print if (length($_)<256);}' > server.log (整形とは違いますが、面倒だったんで256文字以上は排除しました) 外部コマンドを使うのは少し抵抗があったんですが、やはりこのようなケースはCやperl等を利用するしかなさそうですね。 ありがとうございました。

その他の回答 (1)

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.1

fold はバッファをコントロールするオプションがないみたいだね。 http://linuxjm.sourceforge.jp/html/GNU_textutils/man1/fold.1.html sed なら -u オプションでバッファを抑制できるよ。 [sed --help より抜粋] | -u, --unbuffered |   load minimal amounts of data from the input files and flush |   the output buffers more often exec | sed -nru ' :continue /^.{0,256}$/{ p d } h s/^(.{256}).*$/\1/p g s/^.{256}(.*)$/\1/ b continue ' > server.log

MK666
質問者

お礼

教えてgooの操作になれておらず、補足に入力しておりました。すいません。 回答ありがとうございました。

MK666
質問者

補足

タイトルでも「bashで」と記述していたにも関わらず、使用しているシェルはPOSIXシェルでした。 大変申し訳ございません。。。 POSIXシェルにはsedにuオプションが無いようで(manで見る限り、他のバッファリングをコントロールするオプションも見当たらず…)いただいた回答を実現することが出来ませんでした。

関連するQ&A

  • bashのリダイレクト >&- について

    みなさん、こんにちは。 Linuxのsh、bashのリダイレクトに関する質問です。 とあるサイトにて、下記のシェルスクリプトは何を表しているか? という問題がありまして # 【問題】ここから #!/bin/sh exec 3>&1 status=$({ { command1 3>&- 4>&-; echo $? 1>&4 3>&- 4>&-;} | command2 1>&3 3>&- 4>&-;} 4>&1) if [ $status != 0 ]; then ... fi # 【問題】ここまで 問題の答え自体もよく分かっていないのですが、 その前に、「>&-」の部分が何を意図しているのかが理解できておりません。 「2>&1」で、標準エラー出力の出力先を、標準出力の出力先に切り替える。 という認識なのですが、「>&-」はどのような意味なのでしょうか。 どなたかご教示いただけないでしょうか。

  • bashでの複数行のコマンドのリダイレクト

    Linux上のbashを使用して、複数行のコマンドの結果を一度にリダイレクトしたいと思います。 思いついた方法が、 #!/bin/bash cat << EOF >> ./test.log cat /etc/fstab cat /etc/inittab cat /etc/modprobe.conf EOF といった方法なのですが、これですとそれぞれのコマンドの結果ではなく、 単に cat /etc/fstab cat /etc/inittab cat /etc/modprobe.conf と言った出力結果がtest.logに出力されてしまいます。 上記のような複数のコマンドの結果を一度にリダイレクトする方法は無いでしょうか? cat /etc/fstab >> ./test.log cat /etc/inittab >> ./test.log cat /etc/modprobe.conf >> ./test.log と言った方法は避けたいと思います(実際には何10行と言うコマンド結果を出力したいので)

  • URL リダイレクト

    htmlアクセス時においてURLリダイレクトする方法についてお伺いします。 htmlの<meta refresh=..>やjavascriptのlocation.replace、.htaccessのredirectとリダイレクトの方法はいろいろあるようですが、今回はcgi+ssiで実現したいと思っています。 そこで質問なのですが、htmlからSSIを使用して<--!exec cgi="./redirect.cgi"-->のようにしてリダイレクトさせるにはどうすればよいのでしょうか。 cgiではhttpdヘッダのlocatinでURLを指定することで、リダイレクトは可能だと思います。 そしてそのリダイレクトするcgiを直接呼び出したり、フォームで呼び出すことでの動作は正常に確認しました。 しかしhtmlからSSIのexecやvirturlなどを使用してのリダイレクトがどうしてもできません。もちろんSSI,EXEC使用可能なサーバーです。 どうぞよろしくお願いします。

    • 締切済み
    • CGI
  • 「ログから特定日付のレコードのみをリダイレクトする方法」

    「ログから特定日付のレコードのみをリダイレクトする方法」 を探しています。 Linuxサーバ障害で調査中ですが、確認が必要なログが巨大化しており開くことができません。 特定の日付(文字列)を含むレコードのみ抽出してリダイレクトしたいのですが、その方法(コマンド)がわかりません。 現場でスタックしており困っております、どなたかご回答をよろしくお願いいたします! 具体例)2010-04-06(を含む)レコードのみをリダイレクトしたい

  • 標準出力とリダイレクトを同時に実行

    標準出力の結果をファイルに保存するにはリダイレクトを使うと思いますが、同時に標準出力にも表示したいです。 同時に、リダイレクトの「>>」のように、追記していくようにしたいです。 そのような場合、 http://blog.goo.ne.jp/minimal_room/e/26b4d965cd67ac5abfc4ca024e69501f によれば、teeコマンドを使うと良いそうなのですが、 ./a.out | tee log.txt のようにすると、標準出力されず、上手くいきませんでした。 どのようなコマンドを打ったら良いか教えて下さい。

  • Kシェルのリダイレクト

    Kシェルのリダイレクト シェル初心者で申し訳ございませんが、ご教授いただけたら幸いです。 やりたいこと  xxx.kshの実行ログを出力したい。 出力したいログは、以下コマンド実行時に標準出力されるログをファイルへ落としたい。 尚、実際の実行コマンドは、ksh -xは入力しません。 $ ksh -x ./xxx.ksh 上記コマンドを実行すると、詳細なログが表示されるのですが、ファイルへ落としたいと思います。 分かりづらいかも知れませんが、宜しくお願い致します。

  • kシェルのリダイレクトについて

    kシェルを用いてツールを作っています。 このツールを使用する際には、全ての出力をファイルに出力して 処理の最後に出力ファイルをcatで表示したいと考えております。 出力は、exec 2>&1 ~.logでファイル出力しますが、 そのファイルをcatすると、catの結果もファイル出力になってしまいます。 catを標準出力するにはどうしたら宜しいでしょうか?

  • stderrのリダイレクト方法

    標準エラー出力stderrに書き込まれた文字を、リダイレクトでファイルに流し込む方法はあるでしょうか? 意図的にできないようにしたのがstderrの気もしますが、念の為 質問させて頂きました。 どうか宜しくお願い致します。

  • Windowsのリダイレクトエラー

    Windowsのバッチファイルでリダイレクトを用い、出力ログなどを取得しています。 リダイレクトの出力ファイル名が複数のバッチファイルで使用されています。 そのうちいくつかのバッチファイルが同時に実行されてリダイレクトファイルが同時に書かれようとした場合、エラーになっているようなのです。 おそらくリダイレクトファイルの書き込みエラーだと思われます。 このエラーを解除または感知する方法などなりますか? 実は、このエラーを感知すると、バッチファイルをJP1が起動かけているので、JP1の方でエラー感知してしまうのです。 バッチファイルのタイミングをずらせばいいんじゃないかと思われるでしょうが、なかなか難しい状況なのです。 良い案お待ちしております。

  • warnやdieの出力先を変更したい

    お世話になります。 現在perlを勉強しているのですが(ActivePeal5.12.2) コマンドプロンプトから test.pl > test.log と実行した場合、test.pl内で標準出力した文字列がtest.logにリダイレクトされますが test.pl内で ~die "ERROR~"とした場合、"ERROR~"はtest.logに出力されません。 これを簡単にtest.logに出力する方法はないでしょうか。 リダイレクトせず実行した場合、画面に出力されているのでリダイレクトすればそのまま良いと思っていたのですが・・

    • ベストアンサー
    • Perl

専門家に質問してみよう