所以我试图将访问日志重新构建为特定格式,我已经在grok中管理了它但是学习sed听起来非常有用所以请幽默我:
所以,使用SED我试图找到:
(\d+\.\d+\.\d+\.\d+) - - \[(.*?)\] "(\w{3,4}) (\/.*?(\/|\.\w+)) (HTTP(S)?\/.*?)"(\d{3}) (\d+) "(.*?)" "(.*?)" "(.*?), (.*?)"(\[.*?\]) (\[.*?\])
并替换为:
$12 - - [\2] "\3 \4" \8 \9 "$10" "$11"
匹配文件(A)替换发送到文件(B)的行
我试过了:
sed -r -i 's/((\d+\.\d+\.\d+\.\d+) - - \[(.*?)\] "(\w{3,4}) (\/.*?(\/|\.\w+)) (HTTP(S)?\/.*?)"(\d{3}) (\d+) "(.*?)" "(.*?)" "(.*?), (.*?)"(\[.*?\]) (\[.*?\]))/$12 - - [\2] "\3 \4" \8 \9 "$10" "$11"/g;' fileA.txt > fileB.txt
它(GNU)引发以下错误:
sed: -e expression #1, char 1: unknown command: `''
我担心我对sed完全陌生,所以这就是我的Googlefu给了我的。
输入:
IPAddress1 - - [30/Mar/2017:11:33:55 +0100] "GET /image.jpg HTTP/1.1 "200 2607 "http://www.example.co.uk/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "IPaddress2, IPAddress 3"[abc] [def]
预期产出:
IPAddress2 - - [30/Mar/2017:11:33:55 +0100] "GET /image.jpg" 200 2607 "http://www.example.co.uk" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
谢天谢地。
答案 0 :(得分:0)
您需要在我们的正则表达式中进行相同的更改才能使用sed运行它。
我建议您使用-r
参数来使用extended regex syntax,这对JavaScript | PHP | Java用户来说更容易。
这是你的正则表达式的一点点和平:
echo \
'127.0.0.1 - - [30/Mar/2017:11:33:55 +0100] "GET /image.jpg HTTP/1.1 "200 2607 "http://www.example.co.uk/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "IPaddress2, IPAddress 3"[abc] [def]' \
| sed -r 's/([0-9]+(\.[0-9]+)+) - - \[([0-9]+)\/([^\/]+)\/([0-9]+):/"\1", "\3", "\4", "\5"/g'
此示例尚未完成,仅用于显示正确的语法。