用bash排序,如何从awk中排序输出

时间:2017-06-09 10:29:36

标签: bash sorting awk

这里我们有一个日志文件,每个进程都有确认 我必须得到关于创造一个苹果的所有历史。所以我需要找到所有字符串都是苹果创建的,之后我应该找到所有创建状态的苹果作为模式我们使用的进程数,结果应该按时间排序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

1 个答案:

答案 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行时才会发生这种情况。

请注意,如果您的数据不一致,则需要进行更多错误检查。