使用awk匹配日志文件和打印行的日期

时间:2014-11-26 17:08:23

标签: awk sed grep tr

我有一个日志文件,其他100行可能包含以下行

hosta: Info: Tue Nov 25  19:44:39 2014>
User jwayman at position 170.198.3.141 disconnected 

hosta: Info: Tue Nov 23  19:44:39 2014>
User jho at position 170.198.3.141 disconnected 

hosta: Info: Tue Nov 26  19:44:39 2014>
User jho at position 170.198.3.141 disconnected 

我需要查找“已断开连接”的情况,然后如果日期(从它上面的行)与今天的日期匹配,那么我想打印以下信息:

user jho disconnected from server "hosta"

所以我需要从两行中提取数据然后用它做一些事情。 我想在数组中执行此操作并将所有匹配项分配给数组中的变量。 但我希望有人可以采用更简单的方法来实现这一目标,可能使用grepawk

3 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

awk -v today="$(date "+%a %b %d")" '$3 FS $4 FS $5 == today {f=1; next}
                                    f && /disconnected/ {print}
                                    f=0 ' file

解释

  • $(date "+%a %b %d")返回格式Wed Nov 26
  • $3 FS $4 FS $5 == today {f=1; next}检查当前行是否具有此格式。如果是,则激活标记f
  • f && /disconnected/ {print}如果设置了标志并且该行包含disconnected,则打印出来。
  • f=0取消标记。

测试

示例文件:

$ cat a
hosta: Info: Tue Nov 25  19:44:39 2014>
User jwayman at position 170.198.3.141 disconnected 

hosta: Info: Tue Nov 23  19:44:39 2014>
User jho at position 170.198.3.141 disconnected 

hosta: Info: Wed Nov 26  19:44:39 2014>
User jho at position 170.198.3.141 disconnected 

hosta: Info: Wed Nov 26  19:44:39 2014>
User jho at position 170.198.3.141 here

检查脚本:

$ awk -v today="$(date "+%a %b %d")" '$3 FS $4 FS $5 == today {f=1; next} f && /disconnected/ {print} f=0 ' a
User jho at position 170.198.3.141 disconnected 

答案 1 :(得分:0)

与fedorqui相同的概念(他在几分钟内击败了我的帖子)但是你要求的确切输出而不是输入断开线。

awk -v date="$(date "+%a %b %d")" '$2 == "Info:" {
                                       if ($3" "$4" "$5==date) {
                                           s=$1; sub(/:$/,"",s)
                                       } else {
                                           s=""
                                       }
                                       next
                                   }
                                   s && ($NF == "disconnected") {
                                       print "user",$2,"disconnected from server \""s"\""
                                       s=""
                                       next
                                   }'

说明:

  • $2 == "Info:我们正在查看Info
    • if ($3" "$4" "$5==date) {是今天的这一行
    • s=$1; sub(/:$/,"",s)将服务器分配给s并删除尾部冒号
    • else这是其他日子的一行
    • s=""取消设置我们的服务器变量。
    • next跳到下一行
  • s && ($NF == "disconnected")我们有一个已保存的服务器,这是一个断开线
    • print "user",$2,"disconnected from server \""s"\""打印所需的输出
    • s=""取消设置我们的服务器变量。
    • next跳到下一行

答案 2 :(得分:0)

使用GNU awk for gensub()和时间函数:

$ awk -v RS= '
    BEGIN { today=strftime("%a%b%d") }
    (($3$4$5)==today) && /disconnected/ {
        print $8, $9, $NF, "from server \"" gensub(/:/,"\"","",$1)
    }
' file
User jho disconnected from server "hosta"