我認為我自己很擅長正則運算式,但這個看起來非常棘手。
我想修剪所有空格,除了 "" 和 [] 字符之間的空格。
我使用了這個正則運算式,("[^"]*"|\S )\s 但確實將日志的[06/Jan/2021:17:50:09 0300]部分分成了兩個塊。
這是我的整個日志行:
[06/Jan/2021:17:50:09 0300] "" 10.139.3.194 407 "CONNECT clients5.google.com:443 HTTP/1.1" "" "-" "" 4245 75 "" "" "81" ""
結果我基于我的正則運算式使用 sed 命令(用逗號替換空格):
[06/Jan/2021:17:50:09, 0300],"",10.139.3.194,407,"CONNECT clients5.google.com:443 HTTP/1.1","","-","",4245,75,"","","81",""
最后我想要的結果:
[06/Jan/2021:17:50:09 0300],"",10.139.3.194,407,"CONNECT clients5.google.com:443 HTTP/1.1","","-","",4245,75,"","","81",""
uj5u.com熱心網友回復:
由于這些樣本輸入看起來像日志,因此考慮到它們將始終采用相同的格式;有了這個,您可以嘗試以下awk代碼,在 GNU 中顯示的示例中撰寫和測驗awk。
awk -v FPAT='[^]]*\\]|"[^"]*"|([0-9] \\.){3}[0-9] |[0-9]{2,4}' -v OFS="," '{$1=$1} 1' Input_file
解釋:
- 簡單的解釋是
awk在這里使用 GNU 。其中有FPAT可用的選項。 - 以正則運算式形式設定欄位分隔符的選項。它按照 FPAT 中提到的正則運算式匹配事物,并相應地每行生成欄位。
- 然后為所有行設定
OFS(輸出欄位分隔符),。 - 在
awk重置行的主程式中(通過重置第一個欄位),根據 OP 的要求對其應用 OFS 值。這將確保逗號應僅根據需要進入輸出。
正則運算式說明:
[^]]*\\] ##Matching everything till ] followed by ] here.
| ##OR
"[^"]*" ##Matching from " till first occurrence of " everything between them including "
| ##OR
([0-9] \\.){3}[0-9] ##Matching digits followed by dot 3 times followed by digits
| ##OR
[0-9]{2,4} ##Matching 2 to 4 digits here.
uj5u.com熱心網友回復:
您可以通過添加\[[^][]*]作為 Group 1 模式的替代項來匹配方括號之間的字串:
sed -E 's/(\[[^][]*]|"[^"]*"|\S )\s /\1,/g'
現在,POSIX ERE(使用-E選項啟用的語法)模式匹配
(\[[^][]*]|"[^"]*"|\S )- 第 1 組:任一\[[^][]*]-一個[字符,然后零個或多個字符比其他[和],然后一個]字符|"[^"]*"- 一個"字符,零個或多個字符",然后是一個"字符|- 或者\S- 一個或多個非空白字符
\s- 一個或多個空格
請參閱在線演示:
#!/bin/bash
s='[06/Jan/2021:17:50:09 0300] "" 10.139.3.194 407 "CONNECT clients5.google.com:443 HTTP/1.1" "" "-" "" 4245 75 "" "" "81" ""'
sed -E 's/(\[[^][]*]|"[^"]*"|\S )\s /\1,/g' <<< "$s"
輸出:
[06/Jan/2021:17:50:09 0300],"",10.139.3.194,407,"CONNECT clients5.google.com:443 HTTP/1.1","","-","",4245,75,"","","81",""
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/358699.html
