LINUX.ORG.RU

Помогите с разбором вывода

 , , , ,


0

1

есть строка примерно следующего вида: id date prefix par1=one par2=two ...

таких строк очень много, количество параметров и их местоположение вариативно отсюда вопрос, как мне вывести только нужные мне параметры?

сначала я пользовался awk {'print $2 $5'} и не сразу заметил что параметры меняют положение.

подскажите способ вытянуть в переменную из строки допустим только par1=one и ничего больше

я понимаю что надо копать в сторону grep sed и awk но я с ними очень плохо знаком и ничего толкового не получается



Последнее исправление: cetjs2 (всего исправлений: 1)

http://emulek.github.io/sed/

$ echo "id date prefix par1=one par2=two ..." | sed -rn 's/.*(par1=\w+).*/\1/p'
par1=one

тут вместо one могут быть любые буквы/цифры.

emulek
()
Ответ на: комментарий от darkenshvein

можно подумать остальные теги и эхотаг тут правильные.

emulek
()

Что-то типа такого

< file while read id date prefix rest
do
  part1=`sed 's/.*part1=\(\S*\).*/\1/' <<< \"$rest\"`
  part1=`sed 's/.*part2=\(\S*\).*/\1/' <<< \"$rest\"`
  ### В этом месте у тебя всё распихано по переменным id date prefix part1 и part2
done

anonymous
()

Есть более чем один способ сделать это:

echo 'id date prefix par1=one par2=two' | sed 's/^.*\(par1=.*\)\s.*$/\1/g'

echo 'id date prefix par1=one par2=two' | grep -o 'par1=[^[:space:]]*'

echo 'id date prefix par1=one par2=two' | awk '{for (f=1;f<=NF;f++) if ($f ~ /^par1=/) print $f}'

echo 'id date prefix par1=one par2=two' | tr ' ' '\n' | grep ^par1= | cut -d= -f2
Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от mbwa

да я уже понял что возможно неверно прикрепил теги, однако я не считаю что это вообще не касается дебиана

ilmenshik
() автор топика
Ответ на: комментарий от anonymous

вот это, пожалуй, самое близкое к тому что надо, проблема в том что я обрабатываю поток (cat <file>, хотя не исключено что можно как-то проще)

в общем вот пример

# cat /var/log/gre.log
2 20.12.2011_22:11 val=here rep=this temp=20
5 21.12.2011_25:16 val=this rep=now failed
7 22.12.2011_23:15 val=here rep=this darem=220207 temp=20
9 22.12.2011_24:28 val=now rep=now
46 23.12.2011_25:56 val=now rep=this darem=100204
345 24.12.2011_22:32 val=here rep=this
я сильно подрезал размер чтоб читалось, но там между параметрами еще куча всего, мне надо каким-то макаром вывести всё из этих логов но хотябы следующим видом:

# cat /var/log/gre.log
2 20.12.2011_22:11 val=here rep=this temp=20
5 21.12.2011_25:16 val=this rep=now  temp=
7 22.12.2011_23:15 val=here rep=this  temp=
9 22.12.2011_24:28 val=now rep=now  temp=
46 23.12.2011_25:56 val=now rep=this  temp=
345 24.12.2011_22:32 val=here rep=this  temp=
ilmenshik
() автор топика
Ответ на: комментарий от ilmenshik
$ cat norm_log.awk 
#!/usr/bin/awk -f

{
    delete par
    for (i = 1; i <= NF; i++) {
        if (split($i, tokens, /=/) == 2) {
            par[tokens[1]] = tokens[2]
        }
    }
    print $1 " " $2 " val=" par["val"] " rep=" par["rep"] " temp=" par["temp"]
}
$ cat gre.log 
2 20.12.2011_22:11 val=here rep=this temp=20
5 21.12.2011_25:16 val=this rep=now failed
7 22.12.2011_23:15 val=here rep=this darem=220207 temp=20
9 22.12.2011_24:28 val=now rep=now
46 23.12.2011_25:56 val=now rep=this darem=100204
345 24.12.2011_22:32 val=here rep=this
$ cat gre.log | ./norm_log.awk 
2 20.12.2011_22:11 val=here rep=this temp=20
5 21.12.2011_25:16 val=this rep=now temp=
7 22.12.2011_23:15 val=here rep=this temp=20
9 22.12.2011_24:28 val=now rep=now temp=
46 23.12.2011_25:56 val=now rep=this temp=
345 24.12.2011_22:32 val=here rep=this temp=

p.s. И, да, анонимус правильно советует, что

./norm_log.awk < gre.log
оптимальнее, чем
cat gre.log | ./norm_log.awk

unterwulf
()
Ответ на: комментарий от anonymous

< file command Это тоже самое, что cat file | command

нет. Второе хуже: две команды СРАЗУ.

emulek
()
Ответ на: комментарий от ilmenshik
#!/bin/sed -rf

s/^(\s*(\S+\s+){2}).*(val=\S*).*(rep=\S*)(.*)/\1\3 \4\n\5/
T
/temp=/ s/\n.*(temp=\S+).*/ \1/
/\n/ s/\n.*/ temp=/
$ ./t.sed t.txt 
2 20.12.2011_22:11 val=here rep=this temp=20
5 21.12.2011_25:16 val=this rep=now temp=
7 22.12.2011_23:15 val=here rep=this temp=20
9 22.12.2011_24:28 val=now rep=now temp=
46 23.12.2011_25:56 val=now rep=this temp=
345 24.12.2011_22:32 val=here rep=this temp=

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.