LINUX.ORG.RU

Выборка строк из диапозона

 


0

3

Добрый день

Имеется лог файл , который нужно распарсить и вычленить в отдельный файл конкретное исключение. Оно выглядит примерно так !!!екфтызю Ф133Ж ЯФВУКОЛФ зщ зкшсршту Xxxxxx xxxxx. вцфвфцвцфвцфвфцвфцвцфв вцфвфцвцфивцфрвцфвоцфтвоцфтвоцфтвофцтовфцтов вошцошвфошовшцофшвошцфошвоцшф 10 вофцшвошфцовшфцошв 09:12:11

---Xxxxx. Текст не важен. Грубо нужно дергать такие исключения как xxx я пометил ключевые слова для поиска. Причем значение xxxxx в первой строке является уникальным, которое только для данного исключения встречается, в последней же строке xxx значит значение которое встречается постоянно т.е грубо accept decline. Есть у кого мысли? надеюсь я доступно обьяснил.

Нужно достать «Xxxxx»?

echo '!!!екфтызю Ф133Ж ЯФВУКОЛФ зщ зкшсршту Xxxxxx xxxxx. вцфвфцвцфвцфвфцвфцвцфв вцфвфцвцфивцфрвцфвоцфтвоцфтвоцфтвофцтовфцтов вошцошвфошовшцофшвошцфошвоцшф 10 вофцшвошфцовшфцошв 09:12:11' | awk '{print $6}'

надеюсь я доступно обьяснил.

Пример просто жесть, да и объяснение не лучше.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

Сейчас попробую объяснить лучше Пример ошибки

!!!Транспорт xg813 задержка по причине Ожидание связи

вцфвфцвфцвфцвфцвфцв

вцфвфцвфцвфцвфцвфц

вфцвфцвфцвфцвфцв

Время начала задержки : 08:12:03

---Принято

И таких сообщений в файле много. Хочу для каждого такого сообщения вычленить xg813 08:12:03 Принято. Сообщений много разных, уникальный идентификатор ошибки это Ожидание связи

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

Ну сначала вы другую строку показывали. И вообще это одна строка?

Если у вас каждое сообщение пишется полностью одной строкой, «место» нужных полей в строке не меняется, то awk - самый простой вариант. Если строк несколько то придется городить костыли.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

Формат сообщения в последним посту ровно такой какой есть. Я смотрел в сторону sed, но что-то не получается. Про какие костыли вы говорите?

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

А если грепнуть все такие исключения из файла и записать одной монолитной строкой без пробелов и энтеров, а потом использовать awk. Так покатит?

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

Не понял. Если у вас есть строка, в которой положение нужных элементов не меняется, то вы просто говорите «awk, дай мне столбцы 2, 4 и 16». Если у вас там на каждой строке что-то уникальное (ну относительно, в рамках одного сообщения хотя бы), то вам нужно строить конструкцию типа «если строка начинается со слова, которое соответсвует регулярке str[0-9][a-z] то дай мне второй столбец этой строки, если строка начинается с дефиса дай мне символы с третьего по пятнадцатый, а из всех остальных строк выбери подстроки короче 6 символов», что пишется и дебажится гораздо сложнее первого варианта.

alozovskoy ★★★★★
()
Ответ на: комментарий от crybabykillzz

Так?

$ cat log.txt
sdfsdfsd
!!!Транспорт xg813 задержка по причине Ожидание связи
вцфвфцвфцвфцвфцвфцв
вцфвфцвфцвфцвфцвфц
вфцвфцвфцвфцвфцв
Время начала задержки : 08:12:03
---Принято
sdfsdf
!!!Транспорт xg813 ускорение по причине Слишком быстрая связь
вцфвфцвфцвфцвфцвфцв
вцфвфцвфцвфцвфцвфц
вфцвфцвфцвфцвфцв
Время начала задержки : 08:12:03
---Принято
dfsafa
!!!Транспорт xg813 задержка по причине Ожидание связи
вцфвфцвфцвфцвфцвфцв
вцфвфцвфцвфцвфцвфц
вфцвфцвфцвфцвфцв
Время начала задержки : 08:12:03
---Принято
dfsafa

$ cat log.txt | sed -n '/задержка/,/^---/ p' | grep 'задержка\|Время начала задержки\|^---' | sed 's/^!!!Транспорт \([^ ]\+\).*$/\1/g' | sed 's/^Время начала задержки : //g' | sed 's/^---//g' | sed 'N;N;s/\n/ /g'
xg813 08:12:03 Принято
xg813 08:12:03 Принято


Писал максимально доступно, чтобы ты мог подменить токены, по которым делается выборка.

sed -n '/магия/,/магия/ p' - вывести кусок текста между двумя строками
grep 'магия'- фильтр строк
sed 's/магия/магия/g' - замена частей строки (фильтр внутри строки)
sed 'N;магия' - работаем с двумя строками (в моем случае - с тремя)

Расшифровка магии здесь

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от crybabykillzz

уникальный идентификатор ошибки это Ожидание связи

Не сразу прочитал. В моем примере идентификатором было «задержка».

Kroz ★★★★★
()
$ echo 'A
!!!Транспорт N1 задержка по причине R1
B
Время начала задержки : T1
---S1 
C
!!!Транспорт N2 задержка по причине R2
D
Время начала задержки : T2
---S2
E' | perl -0ne 'print if s/.*?!!!Транспорт ([^\n]*) задержка по причине ([^\n]*)\n.*?Время начала задержки : ([^\n]*)\n---([^\n]*)\n(?:(?!.*задержка.*).)*/\1 \2 \3 \4\n/gs'
N1 R1 T1 S1 
N2 R2 T2 S2
ArcFi
()
Ответ на: комментарий от crybabykillzz

Можно и на sed, сработает с вероятностью 50%: или сработает или нет.

#!/usr/bin/sed -rnf

# search for '!!!' at the beginning of a line
s/^!!!//; 

# skip everything below and start new cycle if not found
T; 

# found; extract 'xx000'
s/.* (..[0-9]{3}) .*/\1 /; 

# and 'hold' it
H; 

# do {read new line; try to extract pattern;} 
#     while not found '..:..:..'
:l1; 
    n; 
    s/.*(..:..:..).*/\1 /; 
    T l1;
    
# append what's been found to previous 'hold'
H;

# do {read new line; try to extract pattern;} 
#     while not found '---' at the beginning of a line
:l2; 
    n; 
    s/^---(.*)/\1/; 
    T l2;

# append everything after '---' to our 'hold'
H;

# bring 'hold space' in the context
x;

# remove all newline chars it has
s/\n//g;

# print result
p;

# clear 'hold'
s/.*//;x;

# repeat whole cycle for next line

Запускать так:

$ chmod +x script.sed
$ ./script.sed messages.txt

Тот же скрипт, но через командную строку:

$ sed -rn 's/^!!!//;T;s/.* (..[0-9]{3}) .*/\1 /;H;:l1;n;s/.*(..:..:..).*/\1 /;T l1;H;
           :l2;n;s/^---(.*)/\1/;T l2;H;x;s/\n//g;p;s/.*//;x;' \
           messages.txt

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

Типо

awk '/^!!!/{a=$2}/^Время/{b=$5}/^---/{print a,b,$0}' file.txt

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

А простая state-машина на BASH не существует что ли?

Ограничение BASH - только скорость обработки файла строка за строкой. Если торопится некуда - никаких sed, awk и тем более зperl'а здесь не нужно.

DRVTiny ★★★★★
()
Ответ на: комментарий от crybabykillzz

Welcome
Помечай тему как решенную.

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