Bash

以 3 列格式從文本字元串中解析日期

  • August 28, 2019

我從一個文本文件中獲得了一組行。它們看起來與此類似,並且始終具有以下結構:

           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可能是我需要的答案,我對此都不太了解。

檢查 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

您可以使用sed正則表達式來刪除日期。

假設您的數據儲存在文件input中。

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是對中間部分的反向引用並被列印出來。

引用自:https://serverfault.com/questions/980919