2017-04-24 9 views
0

私はシェルコマンドからコンソール出力の量を制限するためのbashスニペットを探していますが、これは潜在的に冗長すぎる可能性があります。冗長すぎるコマンドからの出力を制限する方法はありますか?

この目的は、CIサーバーの過負荷(またはクライアントが出力を尾引きすること)を防止するために、コンソール出力の量を制限したいビルド/ CI環境での使用を目的としています。

全要件のみだけコマンド出力の底部(尾部)から100行までのコマンド出力

  • ディスプレイの上部(頭部)から100行まで

    • 表示
    • アーカイブstdoutstderrの両方をcommand.log.gzファイル
    • コンソール出力を相対的にリアルタイムで表示する必要があります。結果を最後に出力する解決策は、私たちが見ることができるように許容できませんその実行の進行状況。

      • unbuffer
      • |& teeはアーカイバとテール/ヘッド
      • |& gzip --stdout >command.log.gzの両方に出力を送信するために使用することができますバッファリングされていないことを標準出力/標準エラー出力を強制的に使用することができ現在の調査結果はアーカイブでき

      コンソールの出力

    • head -n100およびtail -n100は、それらが導入するコンソール出力を制限するために使用できます望ましくない結果のような少なくともいくつかの問題の出力線の数が200ここ
  • +0

    '[-f command.log.gz] && gunzip command.log.gz; tmp &&($(wc -l 100))&& {head -n100 tmp; tail -n100 tmp;} cat tmp; cat tmp >> command.log; gzip command.log; rm tmp' –

    答えて

    0

    下にある場合には、便宜上、10行の出力とその意志を処理実証されている私の現在不完全溶液(たぶん)最初に出力を制限しています2行と最後の2行。

    #!/bin/bash 
    
    seq 10 | tee >(gzip --stdout >output.log.gz) | tail -n2 
    
    1

    私が理解していることは、オンライン出力を生成する必要があることです。 ここでは、私が考えることができる機能があります。

    limit_output() { 
        FullLogFile="./output.log" # Log file to keep the input content 
        typeset -i MAX=15 # number or lines from head, from tail 
        typeset -i LINES=0 # number of lines displayed 
    
        # tee will save the copy of the input into a log file 
        tee "$FullLogFile" | { 
         # The pipe will cause this part to be executed in a subshell 
         # The command keeps LINES from losing it's value before if 
         while read -r Line; do 
          if [[ $LINES -lt $MAX ]]; then 
           LINES=LINES+1 
           echo "$Line" # Display first few lines on screen 
          elif [[ $LINES -lt $(($MAX*2)) ]]; then 
           LINES=LINES+1 # Count the lines for a little longer 
           echo -n "."  # Reduce line output to single dot 
          else 
           echo -n "."  # Reduce line output to single dot 
          fi 
         done 
         echo ""  # Finish with the dots 
         # Tail last few lines, not found in head and not more then max 
         if [[ $LINES -gt $MAX ]]; then 
          tail -n $(($LINES-$MAX)) "$FullLogFile" 
         fi 
        } 
    } 
    

    スクリプトで使用するか、現在のシェルにロードするか、またはユーザーセッションでロードするために.bash_profileに入れます。

    使用例:cat /var/log/messages | limit_output又は./configure | limit_output

    関数は、標準入力を読み取り、ログ・ファイルに保存し、最初のMAXラインを表示し、その後、単一のドットにそれぞれのラインを削減する画面上で、次に(。)最終的に最後のMAX行を表示します(または、出力がMAX * 2より短い場合は少なくなります)。

    関連する問題