我有一个记录文件,按日期存储我们系统的状态。生成它的脚本通过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
答案 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块,但我们在这里没有使用它。)
next
时,我们告诉awk读取新的输入行并重新开始处理它的条件。这里有关于您的样本数据的实际操作:
ghoti@pc$ ./awkdate 1344279905 1344280203 data.txt
1344279905 | 0 | 0 | node | 3
1344280202 | 0 | 0 | node | 1
1344280203 | 0 | 0 | node | 2
ghoti@pc$