使用SED:查找正则表达式>替换为匹配组

时间:2017-03-30 15:00:20

标签: regex sed gnu

所以我试图将访问日志重新构建为特定格式,我已经在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"

谢天谢地。

1 个答案:

答案 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'

此示例尚未完成,仅用于显示正确的语法