Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从bash中的字符串中提取日期和时间_Bash_Awk - Fatal编程技术网

从bash中的字符串中提取日期和时间

从bash中的字符串中提取日期和时间,bash,awk,Bash,Awk,我正在分析一些日志文件,只想提取日期和时间数据。日志文件如下所示: 2017-03-01 12:00:15.896 Sync DeliveryContacts: 00:00.011(00.011) end 2017-03-01 12:00:16.473 SyncTables(): 00:00.293(00.293) end 2017-03-01 12:02:48.636 00:00.000(00.000) end [YYYY-MM-DD] [hh:mm:ss.000] [mm:ss.000]

我正在分析一些日志文件,只想提取日期和时间数据。日志文件如下所示:

2017-03-01 12:00:15.896 Sync DeliveryContacts: 00:00.011(00.011) end
2017-03-01 12:00:16.473 SyncTables(): 00:00.293(00.293) end
2017-03-01 12:02:48.636 00:00.000(00.000) end
[YYYY-MM-DD] [hh:mm:ss.000] [mm:ss.000]
编辑-这也是文件中可能的一行:

2017-03-01 12:00:15.896 Sync Delivery Contacts: 00:00.011(00.011) Started with predefined delay (10:00.000) end
我想得到这样的3个专栏:

2017-03-01 12:00:15.896 Sync DeliveryContacts: 00:00.011(00.011) end
2017-03-01 12:00:16.473 SyncTables(): 00:00.293(00.293) end
2017-03-01 12:02:48.636 00:00.000(00.000) end
[YYYY-MM-DD] [hh:mm:ss.000] [mm:ss.000]
或:

字符串将始终以DateTime(前两列)开头,第二次数据的长度始终为9个字符

我试过:

fgrep "end" *.txt -a /
 | awk '{ print $1 " " $2 " " $4 }'
但这只适用于我示例中的第二行

我想我可以用awk获得前2列,但不知道如何获得第3列。

您可以使用此awk:

fgrep "end" *.txt -a | awk '{sub(/\(.*/, "", $(NF-1)); print $1, $2, $(NF-1)}'

2017-03-01 12:00:15.896 00:00.011
2017-03-01 12:00:16.473 00:00.293
2017-03-01 12:02:48.636 00:00.000
sub
功能用于去除以
开头的所有文本(

您可以使用此awk:

fgrep "end" *.txt -a | awk '{sub(/\(.*/, "", $(NF-1)); print $1, $2, $(NF-1)}'

2017-03-01 12:00:15.896 00:00.011
2017-03-01 12:00:16.473 00:00.293
2017-03-01 12:02:48.636 00:00.000
sub
功能用于剥离所有以
开头的文本(

,使用单个gawk方法:

awk '{r=""; for(i=3;i<=NF;i++){ r=r$i }; 
      match(r, /\<([0-9]{2}:[0-9]{2}\.[0-9]{3})\(/, a); print $1,$2,a[1];}' file

对于(i=3;i单次呆呆的方法:

awk '{r=""; for(i=3;i<=NF;i++){ r=r$i }; 
      match(r, /\<([0-9]{2}:[0-9]{2}\.[0-9]{3})\(/, a); print $1,$2,a[1];}' file


for(i=3;i根据您问题中的示例,您只需要:

$ awk -F'[ (]' '{print $1, $2, $(NF-2)}' file
2017-03-01 12:00:15.896 00:00.011
2017-03-01 12:00:16.473 00:00.293
2017-03-01 12:02:48.636 00:00.000

如果这还不是您所需要的全部,则编辑您的问题,以提供更具代表性的示例输入和预期输出。

根据问题中的示例,您所需要的是:

$ awk -F'[ (]' '{print $1, $2, $(NF-2)}' file
2017-03-01 12:00:15.896 00:00.011
2017-03-01 12:00:16.473 00:00.293
2017-03-01 12:02:48.636 00:00.000
awk '{print $1,$2, substr($(NF-1),1,9)}' file

2017-03-01 12:00:15.896 00:00.011
2017-03-01 12:00:16.473 00:00.293
2017-03-01 12:02:48.636 00:00.000

如果这还不是你所需要的全部,那么编辑你的问题,以提供更具代表性的样本输入和预期输出。

你不需要同时使用
fgrep
awk
。你不需要同时使用
fgrep
awk
。最佳答案是因为它的灵活性。更容易根据我的需要进行更改因为3rg arg for match(),所以它是特定于gawk的。你应该在RE btw中转义
。@EdMorton,如果“时间数据”不是在
$(NF-2)
之间,而是在这两者之间,那么这就更加统一了。顺便说一句,不是3rg(如你所写的),而是第三个。我忘了转义dotBut时间数据在$(NF-2)在示例输入的每一行中都提供了OP。如果OPS数据不是他所显示的,还有很多其他的可能性我们需要考虑。也许时间不总是2位数字,而你必须改变<代码> [09] { 2 } <代码>到<代码> [09] {1,2}。
或类似的问题?也许后面不总是有paren?也许它可以在网上出现多次?我的观点很简单,对于OP发布的问题,你不需要如此复杂的解决方案,如果OP数据没有发布,那么任何解决方案都只是一个猜测,那么为什么不帮助OP解决所述问题?最好的答案因为它的灵活性。它更容易根据我的需要进行更改。这比必要的要复杂得多,而且你应该提到它是特定于gawk的,因为3rg arg for match()。你应该在RE btw中避开
。@EdMorton,如果“时间数据”不在
$(NF-2)
之间,顺便说一句,而不是在3rg之间,那就更统一了(正如你所写的),但是第三。我忘记了时间,数据在输入的每一行中都是$F(NF-2)。如果OPS数据不是他所显示的,还有很多其他的可能性我们需要考虑。也许时间不总是2个数字,你必须改变<代码> [09] { 2 } <代码>到<代码> [09] {1,2}。
或类似的问题?也许后面不总是有paren?也许它可以在网上出现多次?我的观点很简单,对于OP发布的问题,你不需要如此复杂的解决方案,如果OP数据没有发布,那么任何解决方案都只是一个猜测,那么为什么不帮助OP解决所述的问题呢?我编辑了这篇文章例如。基本上,我不能相信同一行中不会有更多的空格或括号。我知道为什么这对于回答问题很重要。我看到你添加了一个新的输入行,但你没有为该行添加预期的输出,所以它的使用非常有限。而且该行不能出现在inp中ut到awk脚本,因为它不会由
fgrep“end”生成
因此,将其呈现出来会让人感到困惑而不是有用。幸运的是找到了答案。感谢您的输入,让我对awk进行了更详细的研究。我编辑了这些示例。基本上,我不能相信同一行中不会有更多的空格或括号。我知道为什么这对于回答问题很重要问题我看到您添加了一个新的输入行,但您没有为该行添加预期的输出,因此它的使用非常有限。而且该行不能出现在awk脚本的输入中,因为它不会由
fgrep“end”生成
因此,将其呈现出来会让人困惑而不是有用。幸运的是,已经找到了答案。感谢您的输入,让我更详细地了解了awk。
awk '{print $1,$2, substr($(NF-1),1,9)}' file

2017-03-01 12:00:15.896 00:00.011
2017-03-01 12:00:16.473 00:00.293
2017-03-01 12:02:48.636 00:00.000