как напечатать раздел файла между двумя регулярными выражениями, только если строка внутри раздела содержит определенную строку внутри него - PullRequest
3 голосов
/ 27 августа 2010

У меня есть файл событий с несколькими многострочными событиями между тегами <event> и </event>. Я хочу распечатать все событие От <event> до </event>, только если строка в этом событии содержит либо строку uniqueId = "1279939300.862594_PFM_1_1912320699" или uniqueId = "1281686522.353435_PFM_1_988171542". Файл содержит 100000 событий, и каждое событие имеет от 20 до 35 строк (атрибуты в событии изменяют его длину). Я начал с sed, но мне нужно немного помочь:

cat xmlEventLog_2010-03-23T* | sed -nr "/<event eventTimestamp/,/<\/event>/"

Что мне нужно сделать, чтобы закончить это? Также является ли sed лучшим способом сделать это, учитывая размер файлов?

Заранее спасибо

A

Я хотел отредактировать это, чтобы обновить. По определенным причинам я хочу сделать это с помощью sed. Я попробовал решение Дениса, но, похоже, оно не работает:

bash$ grep 1279939300.862594_PFM_1_1912320699 xmlEventLog*
xmlEventLog_2010-03-23T02:41:15_PFM_1_1.xml:    <event eventTimestamp="2010-03-23T02:41:40.861" originalReceivedMessageSize="0" uniqueId="1279939300.862594_PFM_1_1912320699">
bash$ grep 1281686522.353435_PFM_1_988171542 xmlEventLog*
xmlEventLog_2010-03-23T07:47:38_PFM_1_1.xml:    <event eventTimestamp="2010-03-23T08:02:02.299" originalReceivedMessageSize="685" uniqueId="1281686522.353435_PFM_1_988171542">
bash$ time sed -n ':a; /<event>/,/<\/event>/ N; /<event>/,/<\/event>/!b; /<\/event>/ {/uniqueId="1279939300.862594_PFM_1_1912320699"\|uniqueId="1281686522.353435_PFM_1_988171542"/p;d}; ba' xmlEventLog*

real    1m13.134s
user    1m12.463s
sys     0m0.659s
bash$

Что, очевидно, ничего не вернуло. Так можно ли это сделать с помощью sed?

A

Ответы [ 3 ]

2 голосов
/ 27 августа 2010
awk -vRS="</event>" '/<event>/ && /1279939300.862594_PFM_1_1912320699|1281686522.353435_PFM_1_988171542/{print}' file
1 голос
/ 27 августа 2010

Попробуйте:

sed -n ':a; /<event>/,/<\/event>/ N; /<event>/,/<\/event>/!b; /<\/event>/ {/uniqueId="1279939300.862594_PFM_1_1912320699"\|uniqueId="1281686522.353435_PFM_1_988171542"/p;d}; ba'
0 голосов
/ 27 августа 2010

Вы должны иметь возможность встраивать уникальные идентификаторы непосредственно в регулярное выражение, используя символ |, чтобы разрешить любой из уникальных идентификаторов.Я сделал быстрый тест, и следующее регулярное выражение, кажется, находит правильные записи:

 <event.*?uniqueid=("1279939300\.862594_PFM_1_1912320699"|"1281686522\.353435_PFM_1_988171542").*?</event>
...