我获得了一个来自文本文件的行数组。它们看起来与此类似,并且始终具有以下结构:
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
是中间部分的反向引用,并被打印出来。