Member 13739674 Ответов: 1

Как выбрать некоторые конкретные строки данных в блоке данных и игнорировать те данные, которые не совпадают (linux)


Блок данных начинается с "<SUBBEGIN" и заканчивается "<SUBEND"

Я только хочу перечислить SUBSCRIBERIDENTIFIER, который имеет только одну или комбинацию этих подписок(5093264, VOIPBurn, 2000018).

Любая подписка, которая не находится в скобке выше, не должна быть напечатана/перечислена, даже если она объединена в блоке данных с любой подпиской в скобке выше). Блок данных выглядит следующим образом. Они сохраняются в текстовом файле.

<SUBBEGIN
	SID:28E4
	SUBSCRIBERIDENTIFIER:234817524
	GBRUL:0
	GBRDL:0
	SUBSCRIPTION:5093264&733D8E01CA0E270D&1&FFFFFFFFFFFFFF
	MAXOFFLINEDAYS:0
<SUBEND
<SUBBEGIN
	SID:28E5
	SUBSCRIBERIDENTIFIER:234809156
	GBRUL:0
	GBRDL:0
	SUBSCRIPTION:2000018&73152E10C5625511&1&20170419145702
	MAXOFFLINEDAYS:0
<SUBEND
<SUBBEGIN
	SID:28E6
	SUBSCRIBERIDENTIFIER:234817365
	GBRUL:0
	GBRDL:0
	SUBSCRIPTION:VOIPBurn&73152E10C5625511&1&2017041914570
	MAXOFFLINEDAYS:0
<SUBEND
<SUBBEGIN
	SID:28E7
	SUBSCRIBERIDENTIFIER:234909599
	GBRUL:0
	GBRDL:0
	SUBSCRIPTION:VOIPBurn&73152E10C5625511&1&2017041914465
	SUBSCRIPTION:5083038&733DAA081F1DC70B&1&FFFFFFFFFFFFFF
	MAXOFFLINEDAYS:0
<SUBEND
<SUBBEGIN
	SID:28E8
	SUBSCRIBERIDENTIFIER:234818752
	GBRUL:0
	GBRDL:0
	SUBSCRIPTION:2000018&73159A0C66F20A0A&1&20170322155953
	SUBSCRIPTION:5093264&733D8E01CA0E270D&1&FFFFFFFFFFFFFF
	SUBSCRIPTION:2000020&73159E0C85F20A0A&1&FFFFFFFFFFFFFF
	MAXOFFLINEDAYS:0
<SUBEND
<SUBBEGIN
	SID:28E9
	SUBSCRIBERIDENTIFIER:234818465
	GBRUL:0
	GBRDL:0
	SUBSCRIPTION:5093264&73159A0C66F20A0A&1&20170516214656
	MAXOFFLINEDAYS:0
<SUBEND
<SUBBEGIN
	SID:28F0
	SUBSCRIBERIDENTIFIER:234818440
	GBRUL:0
	GBRDL:0
	SUBSCRIPTION:5093264&73159A0C66F20A0A&1&20170516214656
	SUBSCRIPTION:2000018&73159A0C66F20A0A&1&20170516214656
	MAXOFFLINEDAYS:0
<SUBEND


Результат выводится примерно так:
SUBSCRIBERIDENTIFIER:234817524 SUBSCRIPTION:5093264
SUBSCRIBERIDENTIFIER:234809156 SUBSCRIPTION:2000018
SUBSCRIBERIDENTIFIER:234817365 SUBSCRIPTION:VOIPBurn
SUBSCRIBERIDENTIFIER:234818465 SUBSCRIPTION:5093264
SUBSCRIBERIDENTIFIER:234818440 SUBSCRIPTION:5093264 SUBSCRIPTION:2000018


Что я уже пробовал:

Нет, я не пробовал. Я новичок в Linux

Richard MacCutchan

Это не имеет ничего общего с Linux, это простая проблема сопоставления текста. Вам просто нужно прочитать каждому разделу между SUBBEGIN и SUBEN, и извлечь элементы, которые вы заинтересованы в, сравнивая текст с помощью значений, которые вам нужны.

1 Ответов

Рейтинг:
2

Dar Brett

Это можно легко сделать с помощью нескольких основных утилит cli. Хотя это было бы не самое приятное решение для обновления/обслуживания. Если ваша проблема на самом деле немного сложнее, чем эта, или вам нужно будет обновить ее в будущем, я бы рекомендовал вам использовать высокоуровневый скриптовый язык, такой как Ruby или Python.

Предполагая имя файла block.text, вы можете извлечь нужные вам строки:

sed '/\(<SUBEND\|SUBSCRIBERIDENTIFIER\|SUBSCRIPTION\)/!d' block.txt |\

Усечение Амперсандов
cut -f1 -d"&" |\

Удаление новых строк, вкладок и т. д
tr '\t\r\n' ' ' |\

Замените <SUBEND новыми строками
sed 's/<SUBEND /\n/g' |\

Приведите в порядок ведущие пробелы и двойные пробелы
sed 's/^ \+//g' |\
sed 's/ \+/ /g'