答案1
不要用裝飾來列印匹配線,而是裝飾匹配線並列印所有內容:
awk '/User@Host:/ { $0 = "\033[32m" $0 "\033[39m" }; /Query_time:/ { $0 = "\033[29m" $0 "\033[39m" }; 1'
該awk
程式由三個模式和相關操作組成:
- 匹配的行
User@Host:
用 處理$0 = "\033[32m" $0 "\033[39m"
,它用給定的轉義碼包圍當前行; - 匹配的行
Query_time:
用$0 = "\033[29m" $0 "\033[39m"
;處理 - 模式
1
非零的行(因此所有行)都使用預設操作進行處理,即列印目前行。
這些是累積的:模式與目前行相符的所有操作都按照定義的順序執行。User@Host:
修改行匹配(第一個操作)並列印(第三個操作)。Query_time:
修改行匹配(第二個操作)並列印(第三個操作)。列印與兩者都不匹配的行(第三個操作)。
這是列印所有行的最簡單技術,無需追蹤一行是否已處理(以避免列印一行兩次)。我們不是在每組操作語句中列印某些內容,而是根據需要修改當前行,並且只列印一次(但始終列印它)。