Bash

計算多個文件中行的出現次數

  • April 11, 2021

我有日誌文件,我需要 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 行中出現的$file1s 並將其保存為$match1. 然後它將計算the line每個 s 中出現的$file2s 並將其保存為match2以及每個file3as中出現的次數$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

引用自:https://unix.stackexchange.com/questions/101854