Назад | Перейти на главную страницу

Разобрать дату из текстовой строки в формате 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 символа в столбце одна строка один, в то время как тот же столбец содержит 11 в строке от 2 до конца ...

Как я могу разобрать дату из этих строк, поэтому мой список вместо этого:

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 это, наверное, ответ, который мне нужен, просто я тоже мало знаю.

Ты можешь использовать 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 является обратной ссылкой на среднюю часть и распечатывается.

Проверьте, может ли 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