2017-02-01 2 views
1

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

"foo function1 para1=abc para2=def para3=ghi bar 
foo function2 para1=jkl para2=mno para3=pqr bar" 

Теперь я хочу выполнить один вкладыш на гну Баш с этим выходом:

function1 def 
function2 mno 

foo указывает начало для имени функции и bar знак для конца этого блока. Поэтому я хочу найти слово «foo», извлечь следующее слово (имя функции), а затем выполнить поиск param2 и извлечь только значение.

Как это сделать с помощью однострочного (не сценария)?

+1

в файле журнала, есть ли разрыв строки между баром и foo? –

+0

не между foo и bar, а между следующим блоком foo-bar – Simi

+0

Есть ли действительно двойные кавычки в начале и конце вашего входного файла? –

ответ

1

@Simi: Try:

awk -F'[ ="]' '{for(i=1;i<=NF;i++){if($i=="foo"){printf("%s",$(i+1))};if($i=="para2"){printf(" %s\n",$(i+1))}}}' Input_file 

Здесь я делаю разделитель полей как пробел или = или ("), то я перехожу во все поля строки, а затем ищет строки (foo, para2), если какое-либо поле имеет эти значения, тогда s подразумевает печать значений следующего поля в соответствии с вашим требованием. Дайте мне знать, если это вам поможет.

0

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

С некоторым предположением, если файл журнала будет выглядеть, как показано ниже, то

Либо

$ cat mylog 
foo function1 para1=abc para2=def para3=ghi bar foo function2 para1=jkl para2=mno para3=pqr bar 

ИЛИ с линией-брейке

$ cat mylog 
foo function1 para1=abc para2=def para3=ghi bar 
foo function2 para1=jkl para2=mno para3=pqr bar 

Выход

$ awk -F'[ =]' '{for(i=1;i<=NF;i++)if($i=="foo")print $(i+1),$(i+5) }' mylog 
function1 def 
function2 mno 

Если в случае, если ваш para2 не в порядке, вы можете использовать этот

$ awk -F'[ =]' '{f=""; for(i=1;i<=NF;i++){if($i=="foo")f=$(i+1); if(f && $i=="para2")print f,$(i+1)}}' mylog 

Это как AWK видеть поля в записи с -F'[ =]'

With -F'[ =]' awk would see fields in record like below 

foo function1 para1=abc para2=def para3=ghi bar 
^^  ^ ^^ ^
    1 2   3  4 5  6 
    i (i+1)      (i+5) 

Объяснение

awk -F'[ =]' ' # Set field separator space and = 
       { 
       # Loop through no of fields in record, 
       # NF gives no of fields in current record 

       for(i=1;i<=NF;i++) 

        # If field equal to foo then 
        if($i=="foo") 
          # print next(i+1) and 5th(i+5) field from current field index 
          print $(i+1),$(i+5) 
       } 
      ' mylog  # input file 

если ваш реальный вход что-то еще, пожалуйста, напишите вход и ожидаемый результат

1

Perl One Liner

perl -lane 'print "$F[1] ",(split(/=/,$F[3]))[1]' logfile 

Входной

"foo function1 para1=abc para2=def para3=ghi bar 
foo function2 para1=jkl para2=mno para3=pqr bar" 

Выход

function1 def 
function2 mno 
2

Если это не все, что вам нужно:

$ awk -F'[ =]' '{print $2, $6}' file 
function1 def 
function2 mno 

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

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