从文件中获取两个时间戳之间的行

从文件中获取两个时间戳之间的行

我有一个大文件,我需要使用日期和时间来浏览它。该文件中的每一行都有日期和时间。

我需要搜索各行并获取位于两个特定日期和时间之间的行。

示例文件(日期和时间字段为 $2 和 $3):

SERVER 2015-12-12 05:00:20 some_text_here something  
SERVER 2015-11-02 12:22:40 some_text_here something
SERVER 2015-12-11 20:00:00 some_text_here something
SERVER 2015-12-11 23:00:00 some_text_here something
SERVER 2015-12-12 00:30:00 some_text_here something
SERVER 2015-12-12 00:59:00 some_text_here something
SERVER 2015-09-20 03:28:11 some_text_here something
SERVER 2015-04-16 04:49:59 some_text_here something

我尝试的命令(用户在运行脚本时必须提供 4 个参数):

AAA="$1 $2"
BBB="$3 $4"

awk '$2" "$3>="'"$AAA"'" && $2" "$3<="'"$BBB"'"' file.txt > newfile.txt

我使用上面的行作为脚本,但它不起作用。

newfile.txt应该包含(使用参数2015-12-11 20:00:00 2015-12-12 01:00:00):

SERVER 2015-12-11 20:00:00 some_text_here something
SERVER 2015-12-11 23:00:00 some_text_here something
SERVER 2015-12-12 00:30:00 some_text_here something
SERVER 2015-12-12 00:59:00 some_text_here something

答案1

唯一真正的问题是您分配给$AAAand$BBB而不是AAAand BBB。所以如果你这样做(几乎与你的代码相同):

AAA="2015-12-11 20:00:00"
BBB="2015-12-12 01:00:00"
awk '$2" "$3>="'"$AAA"'" && $2" "$3<="'"$BBB"'"' file.txt > newfile.txt

它应该已经可以工作了。但我建议进行以下进一步的更改,以减少潜在的引用问题(特别是如果您碰巧在其他地方重用此方法或将特殊字符放入AAAor 中BBB):

AAA="2015-12-11 20:00:00"
BBB="2015-12-12 01:00:00"
awk -v string1="$AAA" -v string2="$BBB" '$2" "$3>=string1 && $2" "$3<=string2' file.txt > newfile.txt

您可以-v在 的手册页中阅读有关内容awk

答案2

也许您需要一个可以输入两个特定日期和时间的脚本。 在此输入图像描述

代码:

#!/bin/bash
if [ $# -ne 4 ];then
exit 0
fi
AAA=$1" "$2
BBB=$3" "$4
awk -v begintime="${AAA}" -v endtime="${BBB}" '$2" "$3>=begintime && $2" "$3<=endtime' exa > newfile.txt

答案3

awk不是最好的工具。

sed -e  "/^$AAA/,/^$BBB/,p" file.txt

man sed

相关内容