awk表示日期范围,以秒为单位

时间:2012-08-06 19:15:47

标签: bash awk

我有一个记录文件,按日期存储我们系统的状态。生成它的脚本通过cron运行,因此文件不断变长。我编写了一个脚本,遍历每一行来处理它,这需要很长时间才能完成。我听说awk处理大型文本文件的速度要快得多。我的问题是我从未使用过它。是否可以使用awk获取日期范围内的所有条目?使用date +%s生成日期的时间均为秒。这是一个输出示例,我希望能够快速查找范围内的数据。那么,例如,如何获得第一列在1344279903和1344280204之间的所有行?

1344279903 |  0  | 0 | node  |  1
1344279904 |  0  | 0 | node  |  2
1344279905 |  0  | 0 | node  |  3
1344280202 |  0  | 0 | node  |  1
1344280203 |  0  | 0 | node  |  2
1344280204 |  99  | 0 | node  |  3

3 个答案:

答案 0 :(得分:4)

您可以使用如下条件表达式:

awk '$1 >= 1344279903 && $1 <= 1344280204 { print $0 }' data.txt

答案 1 :(得分:3)

用awk?

awk -F'|' '1344279903 <= $1 && $1 <= 1344280204' file

用sed?

sed -n '/1344279903/,/1344280204/p' file

通过在最后一个print语句之后显式退出,可以使awk表达式更高效:

awk -F'|' '1344279903 <= $1 && $1 <= 1344280204{ print $0; } $1 == 1344280204{ exit; }' file

答案 2 :(得分:2)

以下是我对此的看法:

#!/usr/bin/awk -f

BEGIN {
  start=ARGV[1]; ARGV[1]="";
  end=ARGV[2]; ARGV[2]="";
}

$1 < start { next }

$1 > end { exit }

1

这是如何运作的?

Awk使用一系列应用于每行输入的“condition {command}”块。 BEGIN块是一个在输入开始之前运行的“魔术”块。 (输入结束时有一个类似的END块,但我们在这里没有使用它。)

  • 在此脚本中,我们的BEGIN块根据您的命令行设置“开始”和“结束”变量,然后清空这些变量,以便awk不会尝试将它们解释为输入文件。
  • 下一个条件会导致awk跳过开始日期之前发生的任何行。当我们运行next时,我们告诉awk读取新的输入行并重新开始处理它的条件。
  • 下一个条件会导致awk一旦到达您要打印的日期范围的末尾就退出。 (这假设您的输入数据当然是按时间顺序排列的。)
  • 最后一个条件本身就是“1”。这是“打印当前行”的简写,如果之前的条件都没有达到,它将会这样做(因为前两个条件都会阻止我们到达脚本中的这一点)。

这里有关于您的样本数据的实际操作:

ghoti@pc$ ./awkdate 1344279905 1344280203 data.txt
1344279905 |  0  | 0 | node  |  3
1344280202 |  0  | 0 | node  |  1
1344280203 |  0  | 0 | node  |  2
ghoti@pc$