我有一个日志文件,其他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"
所以我需要从两行中提取数据然后用它做一些事情。
我想在数组中执行此操作并将所有匹配项分配给数组中的变量。
但我希望有人可以采用更简单的方法来实现这一目标,可能使用grep
和awk
。
答案 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"