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()
来解决,但可能不是真的