cut 命令提取字段

cut 命令提取字段

我想从下面的序列中提取日期和时间

/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.NNwhere Nis 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.

相关内容