使用sed获取日期

时间:2018-11-02 17:01:54

标签: linux bash awk sed grep

我有一个文件,其中包含abc...关键字的两个值。我想获取匹配abc...字符串的最新日期。获取日期后,我还需要通过将/替换为-

来格式化日期
    ---other data
2018/01/15 01:56:14.944+0000 INFO  newagent.bridge BridgeTLSAssetector::setupACBContext() - abc...

2018/02/14 01:56:14.944+0000 INFO  newagent.bridge BridgeTLSAssetector::setupACBContext() - abc...

    ---other data

在上面的示例中,我的输出应为2018-02-14。在这里,我正在获取包含abc...值的行,并且仅获取具有最新日期值的行。然后,我需要去除其余的字符串,仅获取日期值。

我正在使用以下sed,但它不起作用

grep -iF "abc..." file.txt | tail -n 1 | sed -e 's/^[^|]*|[^|]*| *\([^ ]*\) .*/\1/' -e 's%/%-%g'

5 个答案:

答案 0 :(得分:1)

这就是您想要的:

grep -iF "abc..." file.txt | tail -n 1 | awk '{print $1}' | sed 's#/#-#g'

输出以下内容:

2018-02-14

答案 1 :(得分:1)

使用awk:

$ awk '/abc\.\.\./{d=$1} END{gsub("/", "-", d); print d}' file.txt
2018-2-14

sed发生的事情:

tac file.txt | grep -Fi 'abc...' | sed 's/ .*//;s~/~-~g;q'

答案 2 :(得分:0)

自从您要求sed-

$: sed -nE ' / abc[.]{3}/x; $ { x; s! .*!!; s!/([0-9])/!/0\1/!g; s!/([0-9])$!/0\1!g; s!/!-!g; p; }' in
2018-02-14
  

参数

  • -n说默认情况下不打印
  • -E说使用扩展的正则表达式
  

脚本

  • / abc[.]{3}/x;在每一行说abc...,将行换为缓冲区
  • $ { x; s! .*!!; s!/([0-9])/!/0\1/!g; s!/([0-9])$!/0\1!g; s!/!-!g; p; }在LAST行($)中说,在{}内部执行命令集。
    • x交换缓冲区以获取最后保存的记录。
    • s! .*!!;从第一个空格(日期之后)删除所有内容
    • s!/([0-9])/!/0\1/!g;在需要的月份添加零
    • s!/([0-9])$!/0\1!g;根据需要在当天添加零
    • s!/!-!g;/转换为破折号
    • p打印结果记录。

答案 3 :(得分:0)

使用sed匹配日期的一部分时,可以使其匹配年份。一条命令中的月份,日期和abc...

sed -rn 's#([0-9]{4})/([0-9]{2})/([0-9]{2}).*abc[.]{3}.*#\1-\2-\3#p' file.txt | tail -1

答案 4 :(得分:0)

简单易用,试试看。

cat filename.txt | grep 'abc' | awk -F' ' '{print $1}'

模式abc始终根据给定的日志进行修复。因此,这将是获取欲望输出的更简单方法。