以 3 列格式解析文本字符串中的日期

以 3 列格式解析文本字符串中的日期

我获得了一个来自文本文件的行数组。它们看起来与此类似,并且始终具有以下结构:

            Full         Tue Aug 27 10:59:43 2019                 1
     Incremental         Tue Aug 27 11:16:41 2019                 1
     Incremental         Tue Aug 27 11:25:28 2019                 1
     Incremental         Tue Aug 27 13:37:29 2019                 1

根据以上输出,我不相信这 3 列符合固定宽度的条件...正如您所见,日期格式可能会根据日期字符串而改变,第一行第一列第一行包含 4 个字符,而同一列从第 2 行到末尾包含 11 个字符...

我怎样才能从这些行中解析日期,所以我的列表是这样的:

Tue Aug 27 10:59:43 2019
Tue Aug 27 11:16:41 2019
Tue Aug 27 11:25:28 2019
Tue Aug 27 13:37:29 2019

我确信grep或者sed可能是我需要的答案,我只是对两者都不太了解。

答案1

检查 awk 是否有帮助。

$ cat abc.txt
            Full         Tue Aug 27 10:59:43 2019                 1
     Incremental         Tue Aug 27 11:16:41 2019                 1
     Incremental         Tue Aug 27 11:25:28 2019                 1
     Incremental         Tue Aug 27 13:37:29 2019                 1
$ cat abc.txt  | awk '{print $2" "$3" "$4" "$5" "$6}'
Tue Aug 27 10:59:43 2019
Tue Aug 27 11:16:41 2019
Tue Aug 27 11:25:28 2019
Tue Aug 27 13:37:29 2019

答案2

您可以使用sed正则表达式来删去该日期。

假设你的数据存储在文件中输入

sed -e 's/^\s\+\S\+\s\+\(.*\S\)\s\+\S\+$/\1/g' input 
Tue Aug 27 10:59:43 2019
Tue Aug 27 11:16:41 2019
Tue Aug 27 11:25:28 2019
Tue Aug 27 13:37:29 2019

第一部分s/^\s\+\S\+\s\+匹配以一个或多个空格字符开头,后跟一个或多个非空格字符,再后跟一个或多个空格字符的行。例如:

'            Full         '
'     Incremental         '

现在让我们看看最后一部分\s\+\S\+$。这将匹配行尾的一个或多个非空白字符,前面有一个或多个空白字符。例如:

'                 1'

中间部分\(.*\S\)是一个可以被引用的匹配组,\1称为反向引用。它匹配从第一个匹配之后开始的任何字符,直到最后一个匹配之前的一个非空白字符。
如前所述,\1是中间部分的反向引用,并被打印出来。

相关内容