使用 AWK 從日誌檔案中提取時間範圍

使用 AWK 從日誌檔案中提取時間範圍

我試圖透過在 .log 檔案中傳遞 shell 變數來從日誌檔案中提取時間範圍awk。這就是我的日誌檔案的樣子。

2014-11-24 12:58:59.290 1.1.1.1  etc..
2014-11-24 13:58:59.290 2.2.2.2  etc..
2014-11-24 14:58:59.290 3.3.3.3  etc ..
2014-11-24 12:58:59.290 4.4.4.4  etc.. 
2014-11-24 15:58:59.290 4.4.4.4  etc..

假設我想提取 12 小時到 13 小時之間的時間範圍。這是我寫的 bash 腳本。

stime=12
etime=13
date_=2014-11-24

awk 'BEGIN {
          a='$stime';b='$etime';d='$date_'; FS="[: ]"
       }

      { 
  if ( $1 == d && $2 >= a && $2 < b )
      print $1 $2 $3
      }'  logfile.txt

我的輸出應該是這樣的。

 2014-11-24 12:58:59.290 1.1.1.1  etc..  
 2014-11-24 12:58:59.290 4.4.4.4  etc..  

我沒有看到任何輸出,也沒有看到任何錯誤。我不知道出了什麼問題。任何對此的幫助將不勝感激。謝謝

答案1

stime=12
etime=13
date=2014-11-24

awk -v a="$stime" -v b="$etime" -v d="$date" -F "[: ]+" '
  { 
  if ( $1 == d && $2+0 >= a && $2+0 < b )
      print $1,$2,$3
  }'  logfile.txt

這會產生輸出:

2014-11-24 12 58
2014-11-24 12 58

筆記:

  1. FS="[: ];"導致欄位分隔符號設定為冒號或空格,後面跟著分號。該組合永遠不會出現在輸入檔中。

  2. 在原始程式碼中,賦值 d='$date_';導致d值為1979。這是因為,當在 awk 程式碼中引入時,該表達式2014-11-24被解釋為需要減法的數值表達式。

  3. 使用 選項將 shell 變數傳輸到 awk 是一個很好的做法-v。 shell 和 awk 都需要正確的引用,而該-v選項允許我們一次處理這些引用問題。

  4. awk 能夠根據上下文進行數字或字母比較。透過添加+0程式碼,我們確保 awk 正在進行數字比較。

相關內容