这里我们有一个日志文件,每个进程都有确认 我必须得到关于创造一个苹果的所有历史。所以我需要找到所有字符串都是苹果创建的,之后我应该找到所有创建状态的苹果作为模式我们使用的进程数,结果应该按时间排序stack.log在下面
03:01:29.312 5 process create apple
05:22:42.211 1 process create banana
05:22:42.302 1 process created
06:09:32.083 12 process create apple
05:12:32.759 5 process created
07:21:45.112 11 process create orange
06:09:35.083 12 process created
03:01:25.714 21 process create apple
05:12:32.308 7 process create grape
05:12:32.309 7 process created
05:12:32.300 21 process created
07:25:41.000 11 process created
这是此任务的示例输出
03:01:25.714 21 process create apple
03:01:29.312 5 process create apple
05:12:32.300 21 process created
05:12:32.759 5 process created
06:09:32.083 12 process create apple
06:09:35.083 12 process created
这是我试过的代码
a=($(awk '$5 == "apple" { print $2 }' stack.log))
for i in "${a[@]}"
do
awk -v search="$i" '$0 ~ search { print $1 }' stack.log
done
答案 0 :(得分:2)
假设"已创建"线条总是在"创造苹果"它可以在一个解析中使用,例如:
awk '/create apple/ { h[$2]; print; next } $2 in h { print; delete h[$2] }'
对输出进行排序:
awk ... | sort
输出:
03:01:25.714 21 process create apple
03:01:29.312 5 process create apple
05:12:32.300 21 process created
05:12:32.759 5 process created
06:09:32.083 12 process create apple
06:09:35.083 12 process created
awk脚本由两个块组成:
/create apple/ { # Only run on lines containing the pattern
h[$2] # Save process id in hash
print # Print the line
next # Skip to next line
}
和
$2 in h { # If this process id was seen before
print # Print the line
delete h[$2] # and remove the id from the hash
}
这个想法是只记住进程ID,直到找到匹配的id。只有在存在先前的create apple
行时才会发生这种情况。
请注意,如果您的数据不一致,则需要进行更多错误检查。