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
если ваш реальный вход что-то еще, пожалуйста, напишите вход и ожидаемый результат
в файле журнала, есть ли разрыв строки между баром и foo? –
не между foo и bar, а между следующим блоком foo-bar – Simi
Есть ли действительно двойные кавычки в начале и конце вашего входного файла? –