我想从下面的序列中提取日期和时间
/hs_nfs/hsfiq/AXZIP-PP567/was_logs/was_admin_logs/start_WPS.log.04-24-2018-08.36.Apr24.zip:ADMU3000I: Server Node_axzip-pp567_AppClusterMember open for e-business;
我想将字段提取为
Date Time
04-24-2018 08.36
答案1
sed -E -e 's/^.*log\.//' -e 's/\.[A-Z].*//' -e 's/([0-9]{4})-/\1 /'
第一个表达式将删除字符串中直到log.
该日期之前的所有内容。
第二个表达式将删除时间后面的点(唯一后面跟有大写字母的点)中的所有内容。
第三个表达式将用空格替换四位数字(年份)后面的破折号。
给定问题中的输入,这将产生
04-24-2018 08.36
答案2
如果日期和时间在每一行中都有唯一的格式,看起来像NN-NN-NNNN-NN.NN
where N
is a number ,那么您可以使用单个 grep:
$ grep -Eo '[0-9]{2}-[0-9]{2}-[0-9]{4}-[0-9]{2}[.][0-9]{2}' file1
04-24-2018-08.36
#to remove the third (last) dash you can pipe to sed
$ grep -Eo '[0-9]{2}-[0-9]{2}-[0-9]{4}-[0-9]{2}[.][0-9]{2}' file1 |sed 's/-/ /3g'
04-24-2018 08.36
如果您还想在正则表达式之上“绑定”,WPS.log.
可以使用 gnu grep 和 -P 开关(perl 正则表达式支持):
$ grep -Po '^.*WPS.log.\K[0-9]{2}-[0-9]{2}-[0-9]{4}-[0-9]{2}[.][0-9]{2}' file1 |sed 's/-/ /3g'
04-24-2018 08.36
#\K == forget everything captured so far == forget ^.*WPS.log.