sed: вывести все строки ПОСЛЕДНЕГО совпадения шаблона A, затем вывести ТОЛЬКО строки, соответствующие шаблону B - PullRequest
0 голосов
/ 27 ноября 2018

Уважаемые коллеги ...

Я создаю файлы журналов из нескольких тысяч строк вида:

a
b
X
d
X
e
b
g
Y
a
Y
d

Например, я хотел бы, чтобы выходные данные моего сценария печатали все строкиЧЕРЕЗ последнее совпадение «^ X», а затем выведите только совпадения «^ Y».Требуемый выход выше:

a
b
X
d
X
Y
Y

«X» всегда будет появляться, но «Y» может не отображаться.В тех случаях, когда «Y» не появляется, я верю , что последний «X» будет в последней строке файла.

Это было довольно сложно сделать с помощью «sed»", хотя это то, что я пытался.Я использую «tac», чтобы изменить порядок строк, чтобы я мог удалить все, что не соответствует «^ Y», до совпадения FIRST с «^ X».Поскольку я не использую «-n», после первого совпадения с «^ X» отображаются все строки.Я просто снова использую «tac», чтобы перевернуть его и поместить в файл.

Этот кажется работающим ...

tac /path/to/logfile | \
sed -e '1,/^X/ { /^Y/!d }' | \
tac > /output/path/logfile.processed

Нет ...?

PS: "tac" общедоступен во всех Linux?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Чтобы избежать чтения дважды, вы можете использовать perl:

$ perl -0777 -lnE 'say $1 while (/(\A[\s\S]*^X$|^Y$)/gm)' file
a
b
X
d
X
Y
Y

или с sed и общими утилитами:

$ sed_cmd=$(printf "1,%sp; /^Y/p" $(cat -n file | sed -nE 's/^[[:space:]]*([[:digit:]][[:digit:]]*)[[:space:]]*X/\1/p' | tail -n 1))
$ sed -nE "$sed_cmd" file
# same output
0 голосов
/ 28 ноября 2018

Вот несколько более логичная версия, использующая Perl.

perl -MList::Util=max -lnE '
    $lines{$.} = $_; 
    eof || next; 
    $last_match = max grep {$lines{$_} =~ /^X/} keys %lines;
    say for @lines{1 .. $last_match};
    say for grep {$_ =~ /^Y/} @lines{$last_match .. $.};
' /path/to/logfile
0 голосов
/ 27 ноября 2018

без tac, двухпроходный подход с awk

$ awk 'NR==FNR{if(/^X$/) lx=NR; next} FNR<=lx || /^Y$/' file{,}

a
b
X
d
X
Y
Y

, помечает последний индекс X и печатает все перед этим индексом и другим шаблоном сопоставления.

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