代码之家  ›  专栏  ›  技术社区  ›  meallhour

使用sed获取日期

  •  0
  • meallhour  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  1
  •   steffen    6 年前

    使用awk:

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

    塞德的事:

    tac file.txt | grep -Fi 'abc...' | sed 's/ .*//;s~/~-~g;q'
    
        2
  •  1
  •   mjuarez    6 年前

    这是您想要的:

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

    输出:

    2018-02-14
    
        3
  •  0
  •   Paul Hodges    6 年前

    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; } 最后一行说( $ {}
      • x 交换缓冲区以取回上次保存的记录。
      • s! .*!!; 删除第一个空格中的所有内容(日期之后)
      • s!/([0-9])/!/0\1/!g; 如果需要,在月份中添加0
      • s!/([0-9])$!/0\1!g; 如果需要的话,给一天加一个零
      • s!/!-!g; 转换 / s到破折号
      • p
        4
  •  0
  •   Walter A    6 年前

    当你使用 sed 为了匹配日期的一部分,您可以让它匹配年份。月份、日期和 abc...

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

    简单一点,试试这个。

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

    因为模式abc总是根据给定的日志进行修复。所以这将是更容易获得欲望输出的方法。