Нужно проанализировать большой файл MIB, используя sed или awk, чтобы удалить устаревшие записи - PullRequest
0 голосов
/ 05 марта 2012

Я ищу способ создания bash-скрипта с использованием, возможно, sed или awk, для поиска определенной строки текста, например «устарел из: 4. *». Если сценарий найден, он должен взять текст, найденный между двумя шаблонами, сделать резервную копию текста в файл, а затем удалить текст из исходного входного файла. Итак, я ищу способ отфильтровать некоторые устаревшие части очень большого файла MIB, который имеет следующую структуру:

-- /*********************************************************************************/
-- /* MIB table for foo 'Something that was once very cool                         */
-- /* Valid from: 4.1.01                                                            */
-- /* Valid to: 4.2                                                                 */
-- /* Deprecated from: 4.2                                                          */
-- /*********************************************************************************/

foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar      
foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar 
foo bar foo bar foo bar foo bar foo bar foo bar foo bar 

-- /*********************************************************************************/
-- /* MIB table for bar 'Another thing that was once very cool                         */
-- /* Valid from: 4.2.01                                                            */
-- /* Valid to: 4.3                                                                 */
-- /* Deprecated from: 4.3                                                          */
-- /*********************************************************************************/

foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar      
foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar 
foo bar foo bar foo bar foo bar foo bar foo bar foo bar 

Итак, в данном случае, скажем, я хочу избавиться от раздела, содержащего «Устаревшее от 4.2». Я придумал следующий сценарий awk, который приближает меня:

{ a[i++ % 5 ]=$0} 
/Deprecated from: 4.2/ {print a[(i-5)%5];print a[(i-4)%5];print a[(i-3)%5];print a[(i-2)%5];i=0}
/Deprecated from: 4.2/,/test/ {if($0 !~ /test/) print }

Однако это работает, только если MIB использует слово «тест» в качестве последней части диапазона для поиска. В действительности конец диапазона поиска выглядит следующим образом:

-- /*********************************************************************************/

Что мне нужно сделать, это пропустить первый экземпляр этого, который происходит сразу после строки, содержащей «Отклонено от», и продолжить поиск до следующего вхождения.

Ожидаемый результат после использования приведенного выше примера MIB и удаления всех вхождений из 4.2 будет следующим:

-- /*********************************************************************************/
-- /* MIB table for bar 'Another thing that was once very cool                         */
-- /* Valid from: 4.2.01                                                            */
-- /* Valid to: 4.3                                                                 */
-- /* Deprecated from: 4.3                                                          */
-- /*********************************************************************************/

foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar      
foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar  
foo bar foo bar foo bar foo bar foo bar foo bar foo bar 
foo bar foo bar foo bar foo bar foo bar foo bar foo bar 

См. Пример кода выше, работающего здесь: http://ideone.com/bOQuK

Моя проблема в том, что мне нужно найти закрывающий паттерн

-- /*********************************************************************************/

Не

-- /test/

Есть идеи?

1 Ответ

1 голос
/ 06 марта 2012

правильное использование RS с awk может решить вашу проблему:

awk  'BEGIN{RS="-- /[\x2a]*/";} 
{ if(NR%2==0)x= ($0!~/Deprecated from: 4\.2/)?1:0;  
  if(x)if(NR%2==0)print RT, $0,RT; else print $0}' yourFile

см. Тест ниже:

Я изменил содержимое (панель foo) в вашем примере, чтобы различить текстиз какого блока:

kent$  cat big.txt 
-- /*********************************************************************************/
-- /* MIB table for foo 'Something that was once very cool                         */
-- /* Valid from: 4.1.01                                                            */
-- /* Valid to: 4.2                                                                 */
-- /* Deprecated from: 4.2                                                          */
-- /*********************************************************************************/

          ##
          ####
          ##   #
      #   ##     ##
      ###############
      #################
      #   ## 
       #
      ###

      #
      ####             
      ### ##          #
      ###  ##           
      ###    ##       # 
      ###    ####   ###
      ###      #######
         #
-- /*********************************************************************************/
-- /* MIB table for bar 'Another thing that was once very cool                         */
-- /* Valid from: 4.2.01                                                            */
-- /* Valid to: 4.3                                                                 */
-- /* Deprecated from: 4.3                                                          */
-- /*********************************************************************************/

          ##
          ####
          ##   #
      #   ##     ##
      ###############
      #################
      #   ## 
       #
      ###


       #             # 
      #               #
      #                 
      ##       ##     #
       ###  ### #######
        ######    ###

запустите строку awk:

kent$  awk  'BEGIN{RS="-- /[\x2a]*/";} { if(NR%2==0)x= ($0!~/Deprecated from: 4\.2/)?1:0;  if(x)if(NR%2==0)print RT, $0,RT; else print $0}' big.txt
-- /*********************************************************************************/ 
-- /* MIB table for bar 'Another thing that was once very cool                         */
-- /* Valid from: 4.2.01                                                            */
-- /* Valid to: 4.3                                                                 */
-- /* Deprecated from: 4.3                                                          */
 -- /*********************************************************************************/


          ##
          ####
          ##   #
      #   ##     ##
      ###############
      #################
      #   ## 
       #
      ###


       #             # 
      #               #
      #                 
      ##       ##     #
       ###  ### #######
        ######    ###

Обратите внимание, что резервная часть не включена.однако это легко быть добавленным.так как в моем сценарии текст не должен отображаться (его необходимо сохранить в другом файле в качестве резервной копии), он уже помечен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...