使用AWK命令提取结果

时间:2015-11-10 16:48:14

标签: linux unix awk

使用此命令:

cat access.log | grep file | grep xx.xx.xx.xx | awk -F "-" '{print $3}' | awk -F "[" '{print $2}' | awk -F "]" '{print $1}' | awk -F " " '{print $1}'

我得到了这个结果:

10/Nov/2015:17:38:47

我需要在输出中输出格式如下的结果:

10/Nov/2015:17

我尝试添加此内容:

awk -F ":" '{print $1,":",$2}'

但我得到了:

10/Nov/2015 : 17

如何在没有空白的情况下获得结果?谢谢:))

3 个答案:

答案 0 :(得分:3)

只需删除逗号,因此awk不会在每个字段之间插入OFS(默认情况下为空格):

awk -F ":" '{print $1":"$2}'

虽然自己设置OFS更加惯用:

awk -F ":" -v OFS=":" '{print $1,$2}'

答案 1 :(得分:0)

我认为你正在接近这种可怕的方式 - 链接多个greps和awks几乎肯定是多余的。

我会猜测你正在查看httpd访问日志,如下所示:(来自:http://www.monitorware.com/en/logsamples/apache.php

64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846
64.242.88.10 - - [07/Mar/2004:16:06:51 -0800] "GET /twiki/bin/rdiff/TWiki/NewUserTemplate?rev1=1.3&rev2=1.2 HTTP/1.1" 200 4523
64.242.88.10 - - [07/Mar/2004:16:10:02 -0800] "GET /mailman/listinfo/hsdivision HTTP/1.1" 200 6291
64.242.88.10 - - [07/Mar/2004:16:11:58 -0800] "GET /twiki/bin/view/TWiki/WikiSyntax HTTP/1.1" 200 7352
64.242.88.10 - - [07/Mar/2004:16:20:55 -0800] "GET /twiki/bin/view/Main/DCCAndPostFix HTTP/1.1" 200 5253
64.242.88.10 - - [07/Mar/2004:16:23:12 -0800] "GET /twiki/bin/oops/TWiki/AppendixFileSystem?template=oopsmore¶m1=1.12¶m2=1.12 HTTP/1.1" 200 11382
64.242.88.10 - - [07/Mar/2004:16:24:16 -0800] "GET /twiki/bin/view/Main/PeterThoeny HTTP/1.1" 200 4924
64.242.88.10 - - [07/Mar/2004:16:29:16 -0800] "GET /twiki/bin/edit/Main/Header_checks?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12851
64.242.88.10 - - [07/Mar/2004:16:30:29 -0800] "GET /twiki/bin/attach/Main/OfficeLocations HTTP/1.1" 401 12851

为了得到你想要的东西:

#!/usr/bin/env perl 
use strict;
use warnings;

while ( <> ) {
    if ( m/64.242.88.10/
     and m/TWiki/ )       { 
        my ($date, $tz) = m/\[(\S+):\d{2}:\d{2} ([-+\d]+)\]/;
        print $date,"\n";
    }
}

打印哪些:

07/Mar/2004:16
07/Mar/2004:16
07/Mar/2004:16

这可以是单行的:

perl -lne 'if (m/64.242.88.10/ and m/TWiki/ and m/\[(\S+):\d{2}:\d{2} / ) { print $1 }' access.log

或者如glenn jackman所述:

perl -lne '/64.242.88.10/ && /TWiki/ && /\[(\S+):\d{2}:\d{2} / && print $1' access.log

答案 2 :(得分:0)

使用相同的日志文件@Sobrique的回答你可以尝试这个更简单的脚本

awk '/^64.242.88.10/ && /twiki/ {print $4}' access.log | cut -c2-15

假设您对特定的ip和keyword = twiki(示例中的文件)感兴趣