Bash 如何将文件从特定日期grep到EOF awk

Bash 如何将文件从特定日期grep到EOF awk,bash,date,awk,grep,format,Bash,Date,Awk,Grep,Format,我在将数据从文件的日期打印到文件的结尾时遇到了一个小问题,即我有文件: 2016/08/10-12:45:14.970000 <some_data> <some_data> ... 2016/08/10-12:45:15.970000 <some_data> <some_data> ... 2016/08/10-12:45:18.970000 <some_data> <some_data> ... 2016/08/10-12

我在将数据从文件的日期打印到文件的结尾时遇到了一个小问题,即我有文件:

2016/08/10-12:45:14.970000 <some_data> <some_data> ...
2016/08/10-12:45:15.970000 <some_data> <some_data> ...
2016/08/10-12:45:18.970000 <some_data> <some_data> ...
2016/08/10-12:45:19.970000 <some_data> <some_data> ...
好的,如果我知道打印数据的具体日期,一切都很简单

awk '/<start_time>/,/<end/'
awk '/2016\/08\/10-12:45:18/,/<end/'

awk'/,/您可以使用
awk
mktime
功能检查时间:

awk -v TIME="2016/08/10-12:45:16" '
    BEGIN{
       gsub("[/:-]"," ",TIME)
       reftime=mktime(TIME)
    }
    {
      t=$1
      sub("[0-9]*$","",t)
      gsub("[/:-]"," ",t)
      if(mktime(t)>reftime) 
          print
    }' file
此脚本获取参考时间并将其转换为数字,然后将其与文件中找到的时间进行比较


注意
sub
gsub
仅用于将您的特定时间格式转换为
awk

可以理解的时间格式。您可以使用
awk
mktime
功能检查时间:

awk -v TIME="2016/08/10-12:45:16" '
    BEGIN{
       gsub("[/:-]"," ",TIME)
       reftime=mktime(TIME)
    }
    {
      t=$1
      sub("[0-9]*$","",t)
      gsub("[/:-]"," ",t)
      if(mktime(t)>reftime) 
          print
    }' file
此脚本获取参考时间并将其转换为数字,然后将其与文件中找到的时间进行比较


注意
sub
gsub
仅用于将您的特定时间格式转换为
awk

所理解的时间格式。您只需使用
awk
即可:

awk '{m = "2016/08/10-12:45:18"} $0 ~ m,0 {print}' file
如果您不确定可以执行的确切时间或日期:

awk '{m = "2016/08/10-12:45:1[6-8]"} $0 ~ m,0 {print}' file
这应该从指定的日期和时间开始打印,打印时间大约为12:45+16-18秒,直到文件结束。字符类
[6-8]
将秒视为原始时间
12:45:1…

输出:

2016/08/10-12:45:18.970000 somedata 3
2016/08/10-12:45:19.970000 somedata 4

只需使用
awk
,您就可以做到这一点:

awk '{m = "2016/08/10-12:45:18"} $0 ~ m,0 {print}' file
如果您不确定可以执行的确切时间或日期:

awk '{m = "2016/08/10-12:45:1[6-8]"} $0 ~ m,0 {print}' file
这应该从指定的日期和时间开始打印,打印时间大约为12:45+16-18秒,直到文件结束。字符类
[6-8]
将秒视为原始时间
12:45:1…

输出:

2016/08/10-12:45:18.970000 somedata 3
2016/08/10-12:45:19.970000 somedata 4

您可以从使用的时间格式支持字母数字比较这一事实中获益。使用awk时,命令可以如下所示:

awk -v start='2016/08/10-12:45:16' '$1>=start'  file

您可以从使用的时间格式支持字母数字比较这一事实中获益。使用awk时,命令可以如下所示:

awk -v start='2016/08/10-12:45:16' '$1>=start'  file


用反斜杠转义斜杠用反斜杠转义斜杠OK,但如果我设置
m=2016/08/10-12:45:18,它不会返回任何东西它对我来说工作正常,因此可能再次检查该命令,或者提供有关您使用的
awk
版本和实际输入数据的更多信息。如果您的输入文件与您的问题不完全匹配,那么这可以解释它。我在Linux和OS X中试过这个命令,都给出了正确的输出。哦,如果我设置
m=2016/08/10-12:45:16,很抱歉,它不会返回任何结果。检查一下。我很感谢您的努力,但我之前的评论中有一个错误。如果您不知道确切的时间,那么您应该使用第二个示例,该示例允许+16-18秒的范围:
m=“2016/08/10-12:45:1[6-8]”。您指定的时间在文件中不存在,因此您需要使用一个近似的时间范围。是的,但正如我提到的,文件(日志文件)有数百行,此日志中包含的时间段约为20分钟,我需要一个时间点的数据(当我更改一些配置时)在这个文件的结尾,我不确定logifle中的新行何时出现,我只知道更改的时间。好的,但是如果我设置
m=2016/08/10-12:45:18
它不会返回任何东西,它对我来说工作正常,所以可能再次检查命令,或者提供有关您使用的
awk
版本的更多信息,以及实际输入数据。如果您的输入文件与您的问题不完全匹配,那么这可以解释它。我在Linux和OS X中试过这个命令,都给出了正确的输出。哦,如果我设置
m=2016/08/10-12:45:16,很抱歉,它不会返回任何结果。检查一下。我很感谢您的努力,但我之前的评论中有一个错误。如果您不知道确切的时间,那么您应该使用第二个示例,该示例允许+16-18秒的范围:
m=“2016/08/10-12:45:1[6-8]”。您指定的时间在文件中不存在,因此您需要使用一个近似的时间范围。是的,但正如我提到的,文件(日志文件)有数百行,此日志中包含的时间段约为20分钟,我需要一个时间点的数据(当我更改一些配置时)在这个文件的结尾,我不确定logifle中的新行是什么时候出现的,我只知道更改的时间。它在任何情况下都有效。但我正在寻找一些不那么复杂的东西。如果找不到,我就用这个。谢谢。它在任何情况下都有效。但我正在寻找一些不那么复杂的东西。如果找不到,我就用这个。谢谢。是的,谢谢,这正是我要找的@DamianSilkowski DST结束时,您的日志文件是什么样子的?例如,它是否从
2016/11/06-01:59:59
2016/11/06-01:00:00
?如果是这样的话,如果您正在搜索上的
2016/11/06-01:30:00
中的条目,脚本应该输出什么?是否应包括在日志文件中传递目标时间戳后DST结束时出现的
2016/11/06-01:00:00
?如果您想像您在问题中所说的那样从时间戳到文件的结尾,那么您需要使用
$1>=start{f=1}f
。仍然有一个灰色区域需要
mktime()
来解决,但这可能不是一个真正的问题。是的,谢谢,这正是我想要的。:)@DamianSilkowski DST结束时,您的日志文件是什么样子的?例如,它是否从
2016/11/06-01:59:59
2016/11/06-01:00:00
?如果是这样的话,如果您正在搜索上的
2016/11/06-01:30:00
中的条目,脚本应该输出什么?是否应包括在日志文件中传递目标时间戳后DST结束时出现的
2016/11/06-01:00:00
?如果您想像您在问题中所说的那样从时间戳到文件的结尾,那么您需要使用
$1>=start{f=1}f
。仍然有一个灰色区域需要
mktime()
来解决,但可能不是真的