
いくつかのログファイルがあり、それを収集して特定の行の発生回数を計算する必要があります。
問題は、最初のファイルの特定の行から始まり、その行以降の項目のみを計算する必要があることです。他のすべてのファイルは徹底的に検索する必要があります。最初のファイルだけを最後のx行に制限するだけです。
その後、結果に200を掛ける必要があります。 1つのコマンドでこれを実行したいと思います。
これは2つのログファイルを使用する実際の例ですが、すぐにそれを3つのファイルに拡張する必要があり、誰かがこれを行うより良い方法を見つけることができることを願っています。
expr `tail -n 5147 Log1.log.2013-11-18 | grep "The line I need to count" | wc -l` + `cat Log2.log | grep "The line I need to count" | wc -l` | awk '{print $1"*200"}' | bc
答え1
2番目の猫の後に3番目のファイルを追加できるはずです。
expr `tail -n 5147 Log1.log.2013-11-18 | grep "The line I need to count" | wc -l` + `cat Log2.log Log3.log | grep "The line I need to count" | wc -l` | awk '{print $1"*200"}' | bc
例:
$ echo abc > 1.txt
$ echo cde > 2.txt
$ echo def > 3.txt
$ cat 1.txt 2.txt 3.txt | grep d
cde
def
答え2
ファイル数に関係なく、一般的な解決策:
for file1 in log1.txt log2.txt logN.txt; do
for file2 in logA.txt logB.txt logC.txt; do
for file3 in logD.txt logE.txt logF.txt; do
match1=$(tail -n 5147 $file1 | grep -c 'The line');
match2=$(grep -c "the line" $file2);
match3=$(grep -c "the line" $file3);
echo "($match1 + $match2 + $match3) * 200" | bc;
done;
done;
done
the line
これにより、各sの最後の5147行で発生回数が計算され、として保存され$file1
ます$match1
。次に、各sで発生回数を計算して保存します。次に計算します。the line
$file2
match2
file3
$match3
($match1 + $match2 + $match3) * 200
実行中の操作にファイルを追加して構文を変更するだけです。
echo "$(tail -n 5147 Log1.log.2013-11-18 | grep -c 'The line') \
$(grep -c 'The line' Log2.log) $(grep -c 'The line' Log3.log)" |
awk '{print ($1+$2+$3)*200}'
以下はいくつかのヒントです。grep -c
一致を印刷する代わりに計算するので、必要ありませんwc
。awk
数学を実行できるため、必要ありませんbc
。私はもはやシェルで算術演算を実行しないので、echo
代わりに使用しますexpr
。 3つの検索結果をエコーしてに渡すと、次awk
のような結果が出ます。
echo "10 4 12" | awk '{print ($1+$2+$3)*200}'
より簡潔なバージョン:
echo $((($(tail -n 5147 Log1.log.2013-11-18 | grep -c "The line) + \
$(grep -c "The line" Log2.log) + $(grep -c "The lne" Log3.log)) * 200))
これはシンボルを使用してシェルですべての数学演算を実行します$(( ))
。試してみてくださいecho $((2*4))
。読みやすくはありませんが、次のように拡張されます。
echo "$(( ($file1_matches + $file2_matches + $file3_matches) * 200 ))"
答え3
複数のCSVファイルから行を計算する同様の問題を解決しました。
スクリプトの出力であるCSVファイルの大きなリストがあるため、同じフィールドがあります。有効な値を持つ行数に興味があります。
このトリックを実行するコマンドは次のとおりです。
awk -F, '{if ($5>0.0) print $5}' va.2021-04-11.153123.csv va.2021-04-11.111709.csv | wc -l
-F,
区切り記号の設定,
(私のCSVファイルは,
区切られています)'{if ($5>0.0) print $5}'
awk
何をすべきかを知らせる「スクリプト」です。- 5番目のフィールドが
0.0
5番目のフィールドより大きい場合 wc
次に、フラグと一緒にパイプして-l
出力の行数を計算します。
- 5番目のフィールドが
va.2021-04-11.153123.csv va.2021-04-11.111709.csv
2つのCSVファイルがスペースで区切られたリスト。