Bash
計算多個文件中行的出現次數
我有日誌文件,我需要 grep 併計算特定行的出現次數。
問題是我必須從第一個文件的特定行開始,並且只計算該行之後的出現次數。應完全搜尋所有其他文件。只有第一個文件需要限制在最後 x 行。
然後我需要將結果乘以 200。我想用一個命令來做到這一點。
這是一個適用於 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
任意數量文件的通用解決方案:
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
s 並將其保存為$match1
. 然後它將計算the line
每個 s 中出現的$file2
s 並將其保存為match2
以及每個file3
as中出現的次數$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
因為我不再在 shell 中做算術,只是回顯三個搜尋的結果並將它們傳遞給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))
這使用
$(( ))
符號完成了 shell 中的所有數學運算。你可以用echo $((2*4))
. 它不是很容易閱讀,它擴展為:echo "$(( ($file1_matches + $file2_matches + $file3_matches) * 200 ))"
我認為您應該能夠在第二隻貓之後添加第三個文件:
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