我因 sed 脚本编写能力有限而陷入困境,我想知道你们中是否有人可以帮助我。
我有一个非标准的 apache 访问日志,格式如下:
#Version: 1.0
#Fields: c-ip date time cs-method cs-uri sc-status time-taken bytes
#Software: WebLogic
#Start-Date: 2014-07-21 11:21:59
10.000.000.000 2014-07-21 11:22:16 GET /em/skins/login.css 200 0.1 1091
10.000.000.000 2014-07-21 13:55:36 POST /sbconsole/sbconsole.portal?_nfpb=true&_pageLabel=Projects_ViewProjects&ProjectsPortlet= 200 0.766 519376
我混合在一起的脚本是:
sed -i 's/[[:space:]]\+/ /g;s/\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\/\([0-9][0-9]\)/\3-\2-\1/;s:-:/:g' log.access
但我遇到了困难,希望得到一些帮助,这样我就可以在访问日志中以以下格式结束:
10.000.000.000 - - [21/07/2014:11:22:16 +0200] "GET /em/skins/login.css HTTP/1.1" 200 1091
10.000.000.000 - - [21/07/2014:13:55:36 +0200] "POST /sbconsole/sbconsole.portal?_nfpb=true&_pageLabel=Projects_ViewProjects&ProjectsPortlet= HTTP/1.1" 200 519376
仅供参考...我有多个不同的 IP 执行 GET/POST。
下面的 awk 行得到了我想要的输出
awk '!/^#/ && NF{split($2,a,"-"); printf "%s - - [%s/%s/%s:%s] \"%s %s\" %s %s %s\n", $1, a[3], a[2], a[1], $3" +200", $4, $5" HTTP/1.1", $6, $7, $8}' alm_server1_51100_access.log > test.test
一切都归功于费多基
答案1
漂亮的标记:
awk '!/^#/ && NF
{
split($2,a,"-")
printf "%s - - [%s/%s/%s:%s] \"%s %s\" %s %s\n", $1, a[3], a[2], a[1], $3, $4, $5, $6, $7
}' file
如果您的输入只是以 ... 开头的行10.000
,则如下所示:
$ awk '{printf "%s - - [%s:%s] \"%s %s\" %s %s\n", $1, $2, $3, $4, $5, $6, $7}' file
10.000.000.000 - - [2014-07-21:11:22:16] "GET /em/skins/login.css" 200 0.1
10.000.000.000 - - [2014-07-21:13:55:36] "POST /sbconsole/sbconsole.portal?_nfpb=true&_pageLabel=Projects_ViewProjects&ProjectsPortlet=" 200 0.766
如果您还想跳过空行和以 开头的行#
,则可以这样:
awk '!/^#/ && NF{printf "%s - - [%s:%s] \"%s %s\" %s %s\n", $1, $2, $3, $4, $5, $6, $7}' file
两种方法都使用相同的printf
格式,即在字段中添加所需的引号、括号、破折号。
要以不同方式格式化数据,请使用split()
并移动后续数组的元素a[]
:
$ awk '!/^#/ && NF{split($2,a,"-"); printf "%s - - [%s/%s/%s:%s] \"%s %s\" %s %s\n", $1, a[3], a[2], a[1], $3, $4, $5, $6, $7}' file
10.000.000.000 - - [21/07/2014:11:22:16] "GET /em/skins/login.css" 200 0.1
10.000.000.000 - - [21/07/2014:13:55:36] "POST /sbconsole/sbconsole.portal?_nfpb=true&_pageLabel=Projects_ViewProjects&ProjectsPortlet=" 200 0.766