2017-06-06 11 views
0

ファイルにいくつかのバリデーションを実行するスクリプトがあります。 1つの行が95文字(スペースを含む)を超えるかどうかを確認することです。存在する場合は、行が95文字を超える行番号/ sを返します。以下は、検証に使用されるコマンドです。awkコマンドが矛盾した結果を返す

$(cat $FileName > $tempfile) 
totalCharacters=$(awk '{print length($0);}' $tempFile | grep -vn [9][4]) 
if [[$totalCharacters != "" ]]; then 
    totalCharacters=$(awk '{print length($0);}' $tempFile | grep -vn [9][4] | cut -d : -f1 | tr "\n" ",") 
    echo "line too long" 
    exit 1 
fi 

下位環境では、コードは期待どおりに機能しています。しかし、プロダクションでは、検証によってエラーが「行が長すぎます」が返されますが、行番号は返されません。私たちはスクリプトを再読み込みしてもエラーは返されません。

使用しているコマンドで何が間違っているのかを知りたいと思います。 これに取り組んでいた以前の開発者は、awkコマンドの使用で問題になる可能性があると言いましたが、awkコマンドを使用して初めて発生したので、わかりません。

+0

あなたは '$(猫$ファイル名> $の一時ファイル)をどう思います'何をするつもりですか?私は、 '$ FileName'で指定されたファイルを' tempfile'で連結し、出力を '$'ファイルに配置すると思います。そして幸いなことに、標準出力は空です。その出力をコマンドとして解析して実行します。あなたは '$(...)'が必要ではなく、 'cat" $ FileName ">" $ tempfile "'を使用したいと思うかもしれませんが、なぜ入力のコピーが必要なのかは分かりません。あなたは明らかに元のファイルを使うことができます。 –

+0

'grep -vn [9] [4]'コマンドが奇数であることに注意してください。 'grep -vn 94'と同じで、' 94 'を含まない行(行番号と一致するテキストを出力する)を検索します。これは、長さ '194'、 '294'、 '940'、 '1945'などの行はすべて選択されないことを意味することに注意してください(長さ '94 'の行も同様です)。 –

+0

申し訳ありませんが、私はtempFileの前にそのスペースを気付かなかったので、ここにコードを書くと、$ tempFileになるはずです。入力のコピーはたぶんバックアップのためのもので、数回修正されたスクリプトを手に入れたときのようなものでした。 grep -vn [9] [4]については、それらの行が選択されないことはわかりませんでしたが、grepがファイルに94文字以上の行があるかどうかを確認することが説明されています。 – Patrick

答えて

2

これはよく書かれていません。

94文字より長い行がある場合は、行番号と終了をステータス1で表示します。それ以外の場合、終了ステータスは0になり、出力は生成されません。

+0

私は空想になりたいと思って、 '{printf" l:%-6d c:%3d \ n "、NR、length; f = 1} '... –

0

スクリプトはちょうど次のようになります。

awk ' 
    length()>95 { printf "%s%d", (c++?",":""), NR } 
    END { if (c) {print "line too long"; exit 1} } 
' "$FileName" 
関連する問題