Печать всех строк, соответствующих строке, и заданное количество строк после этой строки

Путем "усечения файла" без информирования (или перезапуска )программ, записывающих в файл журнала, ВЫ создали разреженный файл.

Лучшее решение — найти и устранить проблему, вызывающую все эти сообщения в журнале.

Еще один способ избежать этой проблемы: остановить службу ведения журнала, использовать lsof, чтобы убедиться, что файл не открыт другими процессами, затем обрезать файл и перезапустить ведение журнала.

В соответствии с запросом, вот модель того, как это (не работает ):

Программа открывает файл для «добавления», ей сообщают, что файл заканчивается в блоке X, и записывает блок X+1. Вы «обрезаете файл», но программа «знает», что следующий блок для записи — это X+2. Таким образом, файл может давать данные в начале, но точно иметь данные в блоке X+2. Та -Да! Разреженный файл.

2
19.05.2021, 17:50
2 ответа

Ты этого хочешь?

sed -n '/^SCN/,/^\s*$/p' LOG.TXT

Он печатает строки между двумя шаблонами (и строки, которые их содержат):

  • 'SCN' появляется в начале строки(^SCN)
  • и пустая строка, содержащая 0 или более пробельных символов(^\s*$)

и выводит следующее:

SCN DD1251       At Glasgow Road - Kilbowie Road                                
Modified                   By ________                                          
Type CR                                                                         
Region  WS  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1271      C           DD1271    R                                     
        DD1351      D           DD1351    B                                     
                    E                                                           
                                                                                
SCN DD1271       At Glasgow Road - Hume Street                                  
Modified 13-OCT-15 15:06   By BDAVIDSON                                         
Type CR                                                                         
Region  WS  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1301      T           DD1301    A                                     
        DD1251      R           DD1251    C                                     
                                                                                
2
28.07.2021, 11:30

В вашем случае на ум приходит awkпрограмма:

awk '/^SCN/{f=1} !NF{f=0} f' LOG.TXT > JUNCTIONS.TXT

Это будет

  • установить флаг fна 1, если строка начинается сSCN
  • сбрасываем флаг на 0при обнаружении пустой строки (в этом случае мы разрешаем "визуально пустые" строки, накладывая условие, что текстовые поля не найдены, а не символы вообще отсутствуют)
  • печатать текущую строку, только если установлен флаг1

Несколько проще, используя диапазоны адресов вместо явных флагов:

awk '/^SCN/,/^[[:space:]]*$/' LOG.TXT > JUNCTIONS.TXT

Вывод для вашего примера будет:

SCN DD1251       At Glasgow Road - Kilbowie Road                                
Modified                   By ________                                          
Type CR                                                                         
Region  WS  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1271      C           DD1271    R                                     
        DD1351      D           DD1351    B                                     
                    E                                                           

SCN DD1271       At Glasgow Road - Hume Street                                  
Modified 13-OCT-15 15:06   By BDAVIDSON                                         
Type CR                                                                         
Region  WS  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1301      T           DD1301    A                                     
        DD1251      R           DD1251    C                                

В первом примере не печатались разделяющие пустые строки.

2
28.07.2021, 11:30

Теги

Похожие вопросы