Вытащить строки из файла журнала между двумя строками с третьей строкой между - PullRequest
0 голосов
/ 22 марта 2019

Я ищу способ командной строки (в SunOS) извлечь из файла журнала xml-сообщения, содержащие определенную строку.

Например, файл журнала может содержать xml-сообщения в форме:

<message>
    <body>
        <tags> uniqueId="123456" </tags>
    </body>
</message>

Рядом с другими строками журнала с метками времени.Может быть несколько сообщений xml, которые содержат один и тот же идентификатор, что и одна и та же запись, возможно, были выполнены несколько раз.

Чтобы извлечь xmls в настоящее время, у меня есть эта команда awk:

nawk '$0~s{for(c=NR-b;c<=NR+a;c++)r[c]=1}{q[NR]=$0}END{for(c=1;c<=NR;c++)if(r[c])print q[c]}' b=4 a=15 s="someUniqueId" file

проблема у меня заключается в том, что это вытаскивает определенное количество строк.Тем не менее, xmls могут различаться по длине, и я изо всех сил пытаюсь найти способ изменить это так, чтобы он нашел уникальный идентификатор и потянул все строки до "<message>" и все строки до "</message>"

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Вероятно, это работает в идеальном мире (если я правильно понял ваш вопрос):

$ cat file
<message>
    <body>
        <tags> uniqueId="123455" </tags>
    </body>
</message>
<message>
    <body>
        <tags> uniqueId="123456" </tags>      # the one we want
    </body>
</message>
<message>
    <body>
        <tags> uniqueId="123457" </tags>
    </body>
</message>

awk:

$ awk '
{ 
    b=b ORS $0                            # buffer records
}
/<message>/ {                             
    b=$0                                  # reset buffer
} 
/<\/message>/ && b~/uniqueId="123456"/ {  # if condition met at the end marker
    print b                               # output buffer
}' file

Вывод:

<message>
    <body>
        <tags> uniqueId="123456" </tags>      # the one we wanted
    </body>
</message>
1 голос
/ 22 марта 2019

Вы также можете попробовать Perl,

perl -0777 -ne ' while( m{(<message>(.+?)</message>)}sg ) 
     { $x=$1; if($x=~/uniqueId="123456"/) { print "$1\n" }} ' edman.txt

с использованием ввода @ James,

$ cat edman.txt
<message>
    <body>
        <tags> uniqueId="123455" </tags>
    </body>
</message>
<message>
    <body>
        <tags> uniqueId="123456" </tags>      # the one we want
    </body>
</message>
<message>
    <body>
        <tags> uniqueId="123457" </tags>
    </body>
</message>

$ perl -0777 -ne ' while( m{(<message>(.+?)</message>)}sg ) 
    { $x=$1; if($x=~/uniqueId="123456"/) { print "$x\n" }} ' edman.txt
<message>
    <body>
        <tags> uniqueId="123456" </tags>      # the one we want
    </body>
</message>
$
...