指令拆解
awk -F '\]\[' '$4>=beg && $4<=end {print $0}' beg=$beg_tm end=$end_tm ${arrfile[i]}
核心參數說明
- `-F '\]\['`:指定輸入欄位分隔符為正則 `] [`(即「右中括號 + 左中括號」)。Awk 會把每一行依此字串切割成多個欄位($1, $2, $3…)。
- `$4>=beg && $4<=end`:條件判斷——第四欄($4)數值落在變數 `beg` 與 `end` 之間(含邊界)。
- `{print $0}`:滿足條件時輸出整行原始內容。
- `beg=$beg_tm end=$end_tm`:將 Shell 變數傳入 Awk 內部變數,方便動態調整時間窗。
- `${arrfile[i]}`:處理陣列中第 i 個檔案路徑。
實際資料範例
假設日誌行格式如下:
[2024-01-01][10:00:00][INFO][1704067200][UserLogin] user=alice
[2024-01-01][10:05:00][WARN][1704067500][DiskFull] path=/var/log
以 `][` 切割後:
| 欄位 | 內容 |
| $1 | [2024-01-01 |
| $2 | 10:00:00 |
| $3 | INFO |
| $4 | 1704067200 |
<-- Unix 時間戳,供篩選
| $5 | UserLogin] user=alice |
常見坑點
- 若行尾無 `]`,最後一欄會包含殘留字元,建議先 `sed 's/\]$//'` 清理。
- `$4` 需為純數字才能正確比較;若含非數字字元,Awk 會當字串比較,導致邏輯錯誤。
- 大檔案建議改用 `mawk` 或 `gawk --posix` 加速。
延伸應用
同理可用於任何「雙字元分隔符」場景,如 `}{`、`||`、`::` 等,只需在 `-F` 後給對應正則(需轉義特殊字元)。