2016-11-02 4 views
1

Я пытаюсь найти способ извлечь скрипты из созданного файла журнала.Извлечь определенную строку кода с помощью awk (или не awk) из файла журнала

Я застрял в месте, где команда вызывает несколько файлов, и сценарий разделяет их на конечную «\» для непрерывности строк. Например, образец скрипта:

my_command -option \ 
file1 \ 
file2 \ 
file3 
my_command2 .. .. 

Это выглядело легко, но как-то трюк не бить меня в этот момент. Пожалуйста, помогите. Каждая строка в журнале начинается с определенным идентификатором для команды, как:

:: Script_Command:: my_command -option \ 
:: file1 \ 
:: file2 \ 
:: file3 
:: Info lines.... 
:: More info lines ... 
:: Script_Command:: my_command2 ... .. 
:: Info lines ... 

Так что я использовал:

awk '/Script_Command/ {print }' 

И тогда я попытался объединить его с если условие с:

awk '/Script_Command/ {print substr(length(),1)}' 

Но все это не падает на свои места. Пожалуйста, помогите.

Edit: Ближайший я получил здесь:

awk '{if ($NF=="\\" || == "Script_Command::") print ;}' file 

Он по-прежнему оставляет линию file3, как он ничего не соответствует.

Чистое намерение: 1. Когда Script_Command сопоставляется, печатайте строку. 2. При совпадении «\» напечатайте следующую строку. 3. Когда оба совпадают, печатайте линию и следующую строку.

ответ

0

я, наконец, получил эту работу с помощью следующей команды:

awk '/\\/ && /Script_Command/ {print $0;getline;print $0;next} /Script_Command/ {print $0;next} /\\/ {getline;print $0}' 
1

Вы можете использовать СЭД для этого:

sed -n '/Script_Command/ {:a;/\\$/!be;N;ba;:e;p;}' 

Разбивка

      # -n disables auto printing. 
sed -n '/Script_Command/ { # Match regex 
    :a      # Define label 'a' 
    /\\$/!be     # Goto 'e' unless pattern space ends with \ 
    N      # Append next line to pattern space 
    ba      # Goto 'a' 
    :e      # Define label 'e' 
    p      # Print pattern space 
}' 

Вы можете добавить [[:space:]]* к /\\$!be если вы хотите читать строки, оканчивающиеся в косой черты ноль или более пробелов:

/\\[[:space:]]*$/!be 
+0

Это решение выглядит многообещающим. Когда попробовал, сначала он говорит: be: Событие не найдено. Затем в следующей попытке я получаю: sed: -e выражение # 1, char 20: неизвестная команда: '; ' У меня есть версия GNU 4.2.1 – ABX

+0

Не забудьте указать сценарий? RIght теперь '!' Расширяется, что не должно: 'sed -n '/ Script_Command/{: a;/\\ $ /! Be; N; ba;: e; p;}'' – andlrc

+0

Да, я делая это. – ABX

0

Если каждая строка продолжения начинается с :: можно использовать AWK следующим образом:

awk '!/^::/ { p = 0 }   # Set p = 0 if line does not start with :: 
     /Script_Command/{ p = 1 } # Set p = 1 when line contains Script_Command 
     p'      # Print if p is truly 
+0

Прошу прощения за то, что вы не поняли. Каждая строка начинается с :: так что просто фильтрация :: не будет работать. – ABX

+0

Отредактировал мой пример, чтобы уточнить его. Я понял, но мне нужно извлечь следующие строки, где конечная «\» присутствует для каждой строки, даже если «Script_Command» не существует в этой строке. благодаря – ABX

 Смежные вопросы

  • Нет связанных вопросов^_^