Верните первые несколько столбцов, опустите все после него до разделителя и добавьте остальные?

Вход представляет собой файл (text.txt), содержащий следующие строки текста (все пробелы – пробелы):

2016-10-24 10:25:48.939279-0400 0x63a55 Info 0x0 1416 backupd: (TimeMachine) [com.apple.TimeMachine.TMLogInfo] Found 2735 files (298.6 MB) needing backup 2016-10-24 10:25:48.954707-0400 0x63a55 Info 0x0 1416 backupd: (TimeMachine) [com.apple.TimeMachine.TMLogInfo] 6.08 GB required (including padding), 1.2 TB available 2016-10-24 10:27:56.721350-0400 0x63a55 Info 0x0 1416 backupd: (TimeMachine) [com.apple.TimeMachine.TMLogInfo] Copied 3128 items (283.1 MB) from volume Macintosh HD. Linked 5756. 2016-10-24 10:27:59.652854-0400 0x63a55 Info 0x0 1416 backupd: (TimeMachine) [com.apple.TimeMachine.TMLogInfo] Created new backup: 2016-10-24-102758 2016-10-24 10:27:59.638560-0400 0x64abb Error 0x0 52 UserEventAgent: (TimeMachine) [com.apple.TimeMachine.TMLogError] Failed to send message because the port couldn't be created. 2016-10-24 10:28:00.545654-0400 0x63a55 Error 0x0 1416 backupd: (TimeMachine) [com.apple.TimeMachine.TMLogError] Could not back up OS X Recovery to /Volumes/BackupA/Backups.backupdb: Error Domain=NSCocoaErrorDomain Code=-69830 "Failed to get info for unmounted Recovery partition (error -69830): This operation requires an unmounted disk" UserInfo={NSLocalizedDescription=Failed to get info for unmounted Recovery partition (error -69830): This operation requires an unmounted disk} 

Из приведенного выше примера я хочу создать только дату / время, за которым следует весь текст после последнего разделителя брекетов.

Это то, что я хочу из приведенного выше примера:

 2016-10-24 10:25:48 Found 2735 files (298.6 MB) needing backup 2016-10-24 10:25:48 6.08 GB required (including padding), 1.2 TB available 2016-10-24 10:27:56 Copied 3128 items (283.1 MB) from volume Macintosh HD. Linked 5756. 2016-10-24 10:27:59 Created new backup: 2016-10-24-102758 2016-10-24 10:27:59 Failed to send message because the port couldn't be created. 2016-10-24 10:28:00 Could not back up OS X Recovery to /Volumes/BackupA/Backups.backupdb: Error Domain=NSCocoaErrorDomain Code=-69830 "Failed to get info for unmounted Recovery partition (error -69830): This operation requires an unmounted disk" UserInfo={NSLocalizedDescription=Failed to get info for unmounted Recovery partition (error -69830): This operation requires an unmounted disk} 

Я могу использовать разрез , но после разделителя получается только материал.

Например, это:

 cat ~/Desktop/test.txt | grep TimeMachine | rev | cut -d']' -f1 | rev 

… опускает отметку времени:

 Found 2735 files (298.6 MB) needing backup 6.08 GB required (including padding), 1.2 TB available Copied 3128 items (283.1 MB) from volume Macintosh HD. Linked 5756. Created new backup: 2016-10-24-102758 Failed to send message because the port couldn't be created. Could not back up OS X Recovery to /Volumes/BackupA/Backups.backupdb: Error Domain=NSCocoaErrorDomain Code=-69830 "Failed to get info for unmounted Recovery partition (error -69830): This operation requires an unmounted disk" UserInfo={NSLocalizedDescription=Failed to get info for unmounted Recovery partition (error -69830): This operation requires an unmounted disk} 

Я могу использовать это,

 cat ~/Desktop/test.txt | grep TimeMachine | cut -c 1-19,140- 

… но переменные расположения столбцов являются проблемой (обратите внимание на две последние строки):

 2016-10-24 10:25:48 Found 2735 files (298.6 MB) needing backup 2016-10-24 10:25:48 6.08 GB required (including padding), 1.2 TB available 2016-10-24 10:27:56 Copied 3128 items (283.1 MB) from volume Macintosh HD. Linked 5756. 2016-10-24 10:27:59 Created new backup: 2016-10-24-102758 2016-10-24 10:27:59ogError] Failed to send message because the port couldn't be created. 2016-10-24 10:28:00] Could not back up OS X Recovery to /Volumes/BackupA/Backups.backupdb: Error Domain=NSCocoaErrorDomain Code=-69830 "Failed to get info for unmounted Recovery partition (error -69830): This operation requires an unmounted disk" UserInfo={NSLocalizedDescription=Failed to get info for unmounted Recovery partition (error -69830): This operation requires an unmounted disk} 

У меня есть ощущение, что нельзя использовать cut, чтобы делать то, что я хочу, потому что я хочу объединить параметр -c с опцией -d, и я не могу понять это. Куда мне идти дальше?

3 Solutions collect form web for “Верните первые несколько столбцов, опустите все после него до разделителя и добавьте остальные?”

Чтобы ответить на ваш точный вопрос, это не подходит для использования cut по следующим причинам:

  1. Существует несколько разделителей.
  2. Может быть переменное количество полей.

Использование Awk:

 awk -F']' '{print substr($0,1,19), $NF}' text.txt 

Использование Sed:

 sed 's/^\(....-..-.. ..:..:..\).*\]\([^]]*\)$/\1 \2/' text.txt 

Я бы предпочел метод Awk.

Другое решение sed :

 $ sed -E 's/^([^.]+).*\](.*)/\1\2/' ip.txt 2016-10-24 10:25:48 Found 2735 files (298.6 MB) needing backup 2016-10-24 10:25:48 6.08 GB required (including padding), 1.2 TB available 2016-10-24 10:27:56 Copied 3128 items (283.1 MB) from volume Macintosh HD. Linked 5756. 2016-10-24 10:27:59 Created new backup: 2016-10-24-102758 2016-10-24 10:27:59 Failed to send message because the port couldn't be created. 2016-10-24 10:28:00 Could not back up OS X Recovery to /Volumes/BackupA/Backups.backupdb: Error Domain=NSCocoaErrorDomain Code=-69830 "Failed to get info for unmounted Recovery partition (error -69830): This operation requires an unmounted disk" UserInfo={NSLocalizedDescription=Failed to get info for unmounted Recovery partition (error -69830): This operation requires an unmounted disk} 
  • ^([^.]+) фиксировать все не . символы от начала строки
  • .*\] игнорировать все до последнего ] в строке
  • (.*) захватывать оставшиеся символы
  • \1\2 первая и вторая захваченные группы
  • Примечание. Некоторые версии sed используют -r вместо -E для расширенного варианта регулярного выражения
    • sed 's/^\([^.]\+\).*\]\(.*\)/\1\2/' если опция расширенного регулярного выражения недоступна
 sed 's/\(:[0-9]*\).[0-9 \-]*[a-z0-9]x[0-9a-z]*[ ]*[a-zA-Z]*[ ]*[0-9x]*[0-9 ]*/\1 /' 

EDIT: sed использует ленивое сопоставление шаблонов;

  • все в скобках () напечатано в \ 1
  • любое другое совпадение игнорируется
  • ничего после того, как осталось нетронутым
  • разрезать с помощью 2-символьного разделителя
  • Создайте список каждого пользователя, которому принадлежит файл в заданном каталоге, а также количество файлов и каталогов, которыми они владеют.
  • Объедините вывод из df -h / dev / xvda1 в одну строку
  • Как присоединиться к файлам с необходимыми столбцами в Linux?
  • SED переключающие столбцы в одном файле, ограниченном,
  • как использовать awk / cut для получения данных столбца, имеющего пространство
  • Соответствующая ячейка Grep файла csv и индекс этой строки
  • Совокупный и групповой текстовый файл в perl или bash
  • Обработка временных меток вывода tcpdump в режиме реального времени
  • вырезать диапазон столбцов sed / awk / cat
  • cat filename | cut -f2 | head -1> newfile содержит больше символов, чем ожидалось
  • Linux и Unix - лучшая ОС в мире.