我有一个文件,其中包含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'
答案 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始终根据给定的日志进行修复。因此,这将是获取欲望输出的更简单方法。