скрипт оболочки unix для разбора логов с использованием grep - PullRequest
0 голосов
/ 12 ноября 2010

Содержимое events<xyz>.log:

<log>  
 <time>09:00:30</time>  
 <entry1>abcd</entry1>  
 <entry2>abcd</entry2>  
 <id>john</id>  
</log>  
<log>
 <time>09:00:35</time>  
 <entry1>abcd</entry1>  
 <entry2>abcd</entry2>  
 <id>steve</id>  
</log>  
<log>  
 <time>09:00:40</time>  
 <entry1>abcd</entry1>  
 <entry2>abcd</entry2>  
 <id>john</id>  
</log>  

Я хочу извлечь теги entry1 и entry2 из всех записей <log> с <id> 'john' в файл. Я хочу сделать это в сценарии оболочки, который будет смотреть все файлы * .log в каталоге. Вывод должен быть похож на следующий.

Содержание a.out:

<time>09:00:30</time>   
<entry1>abcd</entry1>  
<entry2>abcd</entry2>

<time>09:00:40</time>  
<entry1>abcd</entry1>  
<entry2>abcd</entry2>  

Я новичок в написании сценариев оболочки, однако я попытался с помощью некоторых основных команд хотя бы посмотреть журналы:

$ grep -B 3 -in '<id>john</id>' * > /tmp/a.out
Команда

выше дает мне вывод с тремя строками над тегом id для john следующим образом

...   
events111.log-100- <time>09:00:40</time>  
events111.log-101- <entry1>abcd</entry1>  
events111.log-102- <entry2>abcd</entry2>  
events111.log-103- <id>john</id>  
....  
events112.log-200- <time>06:56:03</time>  
events112.log-201- <entry1>abcd</entry1>  
events112.log-202- <entry2>abcd</entry2>  
events112.log-203- <id>john</id>  

Это нормально, но проблема в том, что -3 строки не будут работать каждый раз, между ними может быть больше тегов, поэтому для определения текста от <time> до </id>. * Требуется некоторая логика анализа 1020 *

Я был бы очень признателен за помощь в составлении сценария для этого.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 12 ноября 2010

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

2 голосов
/ 12 ноября 2010

Выполнение этого с помощью сценария оболочки не совсем подходящий инструмент для работы. Вам действительно нужен парсер. Вот один в Python для одного файла. Вы можете создать вокруг этого цикл и создать целый каталог файлов журналов.

#!/usr/bin/env python
import sys
from BeautifulSoup import BeautifulSoup, Tag   

f = open(sys.argv[1], 'r')   
soup = BeautifulSoup(f.read())    
for log in soup.findAll('log'):
 if log.id.contents[0] == "john":
   print log.entry1
   print log.entry2
0 голосов
/ 09 января 2019

Для тех, кто все еще ищет сценарий оболочки, чтобы найти определенные строки в файлах журналов локально или удаленно, я написал этот сценарий оболочки:

https://github.com/ijimako/logs_extractor

Приветствия

0 голосов
/ 12 ноября 2010
has() { echo "$line" | grep "$1" >/dev/null; }
while read line; do
 has /log && echo;
 (has time   || has entry1 || has entry2) && echo "$line";
done;

печать

<time>09:00:30</time>
<entry1>abcd</entry1>
<entry2>abcd</entry2>

<log> <time>09:00:35</time>
<entry1>abcd</entry1>
<entry2>abcd</entry2>

<time>09:00:40</time>
<entry1>abcd</entry1>
<entry2>abcd</entry2>

Вы можете или не хотите подавлять это "<log>" в строке "time".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...