Bashを使用して空行数を計算して表示します。

Bashを使用して空行数を計算して表示します。

ファイルに連続して21行以上の空行が含まれている場合は、エラーメッセージを送信する必要があります。スペースにはスペースを含めることができます。新しいサーバーに切り替えたとき、現在のソリューションが動作を停止しました。私は一度も動作しなかったかもしれませんが、私はさまざまなスクリプトが動作していることを確認する任務を担当しています。スクリプトはBashで書かれているので、理想的にはソリューションはBashで動作します。それ以外の場合は、問題になると思われるスクリプト内で切り替える必要があります。

エラーメッセージには、空白行の前後に行を含める必要があります。

これは以前に使用されたものです:grepを使用して質問の数を計算します(0より大きい場合は電子メールを送信します)。

grep -nc $'[\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a]' filename

問題行の表示(メールに表示)

grep -n $'[\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a]' filename

繰り返しますが、これがうまくいくかどうかわかりません。ただし、正しく機能するようにしてください。私はこれを試してみましたが、計算には働きます...しかし、空白があり、動作する前/後の行を取得できない場合は動作しません。

grep -czoP '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n' filename

答え1

スクリプトを使用して、awkファイルに特定の数以上の空行があるかどうか、またはスペース(スペースおよび/またはタブ)のみが含まれているかどうかを検出します。

if ! awk -v max=21 '/^[[:blank:]]*$/ { if (++count >= max) exit 1; next } { count = 0 }'
then
    echo 'file contains 21 or more consecutive blank lines'
else
    echo 'file contains no more than consecutive 20 blank lines'
fi <file

これにより、入力ファイルの各行に対して正規表現が^[[:blank:]]*$順番に一致します。この式は、空白行と空白および/またはタブのみを含む行と一致します。式が一致するとカウンタがインクリメントされます。カウンタが指定された最大値(コマンドラインmaxで設定された変数)に達すると、スクリプトはゼロ以外の終了状態で終了します。式が一致しない場合、カウンタはゼロにリセットされます。

答え2

正規表現を使用して、より複雑な一致を検索できます。あなたの場合は、空白文字(0個以上)を許可する各行に追加する必要があります(21行ではなく3行に切り捨てられました)。

grep -czP '[ ]*\n[ ]*\n[ ]*\n' filename

答え3

awkあなたの質問に戻り、それが仕事に適していることに同意します。以下は、awk空白行の前後の行を印刷するスクリプトです。

awk 'BEGIN{AA="";BB="";CC=0}{LST=CC;if(CC==0){BB=AA};AA=$0;if($0 ~ "^[[:space:]]*$"){CC++}else{CC=0;if(LST>21){print "Error:\n"BB"\n"LST" free, to:\n"AA"\n\n"}}}' searched.txt 

デバッグに役立つawkコマンドをファイルに保存できます。これらのファイルは次のとおりです。

BEGIN{AA="";BB="";CC=0}
{ LST=CC;if(CC==0){BB=AA};AA=$0;
  if( $0 ~ "^[[:space:]]*$") { CC++ } 
  else { CC=0; 
         if(LST>21) {print "Error:\n"BB"\n"LST" free, to:\n"AA"\n"}};
} 

bashコマンドは次のようにする必要があります。

awk -f command.file searched.txt

空白の前後に1行以上があると仮定した例です。searched.txt空白行(スペースを含む)以外に他の行がない場合は、この例を適用できます。searched.txt21行以上の空行で始まるか終了します。

答え4

while read -r line; do
    # add +1 every time the line is empty, reset the count if line contains anything
    [[ -z $line ]] && i=$((i+1)) || i=0

    if [[ $i -ge 20 ]]; then
        # Do the error handeling in this block
        echo "ERROR: 20+ empty consecutive lines"
        break # stop reading file by breaking the loop
    fi
done <file

この回答は、不足している条件を含むように編集されました。

関連情報