需要帮助从下面的输出中排序第4列,并仅报告具有最早日期的条目。
当前输出:
Node_name:ABCD Lastacc :2017-01-05 Info :testing *Endtime :2016-12-11* Type :Exist
Node_name:ABCD Lastacc :2017-01-05 Info :testing *Endtime :2016-12-11* Type :Exist
Node_name:ABCD Lastacc :2017-01-05 Info :testing *Endtime :2016-12-15* Type :Exist
预期产出:
Node_name:ABCD Lastacc :2017-01-05 Info :testing *Endtime :2016-12-15* Type :Exist
答案 0 :(得分:1)
sort -k7 -r your_file.log | head -n 1
-k7
:由于您的示例输出在bash中用空格分隔,因此必须按第七列(:2016-12-11
)进行排序。
-r
:反转输出,因此最新(=最新)日期位于第一行。如果你真的对最早(=最老)的日期感兴趣,请将其删除。
答案 1 :(得分:0)
下面将按升序排序,并将grep文件的最后一行
sort -k3你的文件| tail -n 1
答案 2 :(得分:0)
基于排序和获取第一行/最后一行(取决于排序顺序)的解决方案将起作用。
如果你有大量的数据,那么排序的计算密集程度要高得多:因为你只想要最新的一行,你可以简单地解析每一行,扫描整个文件,并保持最新的内存(不需要)排序其他人。)
可以这样做。
#!/bin/bash
data_file="data_file"
regex="Endtime :([0-9-]+)"
while IFS= read -r line
do
[[ $line =~ $regex ]] || continue
match="${BASH_REMATCH[1]}"
[[ "$match" < "$newest" ]] || { newest="$match" ; newest_line="$line" ; }
done <"$data_file"
echo "$newest_line"
对于您的具体情况,很可能单线sort/cut
解决方案足够快,在这种情况下,更短更好,但在十亿行文件中,将有一个通过选择合适的算法来获得巨大的性能差异。
请注意,用于读取日期的正则表达式是粗略的,并假设日期将全部采用相同的有效格式(允许直接比较而无需进一步解析)。有人可能更愿意更改该表达式以更仔细地匹配YYYY-MM-AA格式。