Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
如何在unix中使用AWK获取最新出现的文件并按时间戳排序_Unix_Awk_Grep_Ls - Fatal编程技术网

如何在unix中使用AWK获取最新出现的文件并按时间戳排序

如何在unix中使用AWK获取最新出现的文件并按时间戳排序,unix,awk,grep,ls,Unix,Awk,Grep,Ls,以下是hb_20190930103450.log文件的示例内容 <------some lines-------> [2019-09-30 19:55:59] [MERGE] : ####### BEGIN - claim_response - '2016-01-15' - ####### <------some lines---------> [2019-09-30 20:17:11] [MERGE] : ####### BE

以下是hb_20190930103450.log文件的示例内容

   <------some lines------->
      [2019-09-30 19:55:59] [MERGE] : ####### BEGIN - claim_response - '2016-01-15' - #######
      <------some lines---------> 
      [2019-09-30 20:17:11] [MERGE] : ####### BEGIN - compound_ingred - '2016-01-15' - #######
  <-------some lines---------->
下面是上述命令的结果,它给出了所有日志文件中的所有文件

hb_20190927121800.log [2019-09-27 20:45:56] ser_message1
hb_20190927121800.log [2019-09-27 20:45:58] claim_response
hb_20190927121800.log [2019-09-27 20:46:00] compound_ingred
hb_20190927121800.log [2019-09-27 20:47:36] pha_ree
hb_20190930103448.log [2019-09-29 10:34:48] ser_message1
hb_20190930103448.log [2019-09-29 11:58:22] claim_response
hb_20190930103448.log [2019-09-29 14:17:28] mcompound_ingred
hb_20190930103448.log [2019-09-29 15:05:48] pha_ree
hb_20190930103450.log [2019-09-30 19:11:25] ser_message1
hb_20190930103450.log [2019-09-30 19:55:59] claim_response
hb_20190930103450.log [2019-09-30 20:17:11] compound_ingred
hb_20190930103450.log [2019-09-30 20:17:13] pha_ree
下面是我正在尝试但没有运气

  awk '/BEGIN/ {print FILENAME,$1,$2,$8}' hb_2019*.log |sort|uniq > sdate.txt
有人面对这一点并取得了成功吗

示例预期输出应如下所示,仅包含表的最新条目

hb_20190930103450.log [2019-09-30 19:11:25] ser_message1 
hb_20190930103450.log [2019-09-30 19:55:59] claim_response 
hb_20190930103450.log [2019-09-30 20:17:11] compound_ingred 
hb_20190930103450.log [2019-09-30 20:17:13] pha_ree

据我所知,您有各种键(
ser\u message1
claim\u response
composite\u ingred
,…),您希望从这些键中删除所有文件
hb\u 2019*.log
中每个键的最年轻的条目。通过跟踪每个键的时间,我们可以很容易地做到这一点。我将假设完整的连接文件集在时间上是无序的:


黑暗中的另一个镜头:

$ awk '
FNR==1 { b="" }
/BEGIN/ { b=b (b==""?"":ORS) FILENAME OFS $1 OFS $2 OFS $8 }
END { print b }' hb_2019*.log
更新:对于您的示例数据集的特殊版本,将上述字段用于实际数据(即:字段
FILENAME,$2,$3,$4
,而不是
FILENAME,$1,$2,$8
):


将输出管道改为此

$ ... | sort -k4 -k2,3r | uniq -f3 | sort -k2,3

hb_20190930103448.log [2019-09-29 14:17:28] mcompound_ingred
hb_20190930103450.log [2019-09-30 19:11:25] ser_message1
hb_20190930103450.log [2019-09-30 19:55:59] claim_response
hb_20190930103450.log [2019-09-30 20:17:11] compound_ingred
hb_20190930103450.log [2019-09-30 20:17:13] pha_ree

按名称和时间戳(降序)排序,并使用uniq选择第一个条目,再次按时间排序。

您可以将
排序|…
管道更改为
|排序-k 2,2 |尾部-n 1
。这将按第2列中的ISO日期戳按字典顺序进行排序,然后打印最后一行日期。我试图回答,但显然猜错了您想要的是什么,因此请您的问题包含简洁、可测试的示例输入(即2或3个小hp*.log文件)而这些输入文件的预期输出,这样就不会有人浪费时间猜测了。您的预期输出是什么?@dharani,评论不是为了发布示例,请将它们添加到您的帖子中,然后让我们知道。@dharani,请您在代码标签中添加简单的输入示例和预期输出示例,重新表述您的帖子,然后让我们知道。
$ awk '
FNR==1 { b="" }
/BEGIN/ { b=b (b==""?"":ORS) FILENAME OFS $1 OFS $2 OFS $8 }
END { print b }' hb_2019*.log
$ awk 'FNR==1{b=""}{b=b (b==""?"":ORS) FILENAME OFS $2 OFS $3 OFS $4}END{print b}' hb_201909*
hb_20190930103450.log [2019-09-30 19:11:25] ser_message1
hb_20190930103450.log [2019-09-30 19:55:59] claim_response
hb_20190930103450.log [2019-09-30 20:17:11] compound_ingred
hb_20190930103450.log [2019-09-30 20:17:13] pha_ree
$ ... | sort -k4 -k2,3r | uniq -f3 | sort -k2,3

hb_20190930103448.log [2019-09-29 14:17:28] mcompound_ingred
hb_20190930103450.log [2019-09-30 19:11:25] ser_message1
hb_20190930103450.log [2019-09-30 19:55:59] claim_response
hb_20190930103450.log [2019-09-30 20:17:11] compound_ingred
hb_20190930103450.log [2019-09-30 20:17:13] pha_ree