
我試圖透過在 .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
筆記:
FS="[: ];"
導致欄位分隔符號設定為冒號或空格,後面跟著分號。該組合永遠不會出現在輸入檔中。在原始程式碼中,賦值
d='$date_';
導致d
值為1979
。這是因為,當在 awk 程式碼中引入時,該表達式2014-11-24
被解釋為需要減法的數值表達式。使用 選項將 shell 變數傳輸到 awk 是一個很好的做法
-v
。 shell 和 awk 都需要正確的引用,而該-v
選項允許我們一次處理這些引用問題。awk 能夠根據上下文進行數字或字母比較。透過添加
+0
程式碼,我們確保 awk 正在進行數字比較。