sed: печать строк между двумя словами только тогда, когда одна из строк соответствует третьему слову или любому шаблону - PullRequest
4 голосов
/ 09 июня 2011

я знаю, что sed печатает строки между словами FOO и BAR из test.txt, используя следующую команду

  sed -n '/FOO/,/BAR/p' test.txt

но как заставить sed печатать строки между FOO и BAR только в том случае, если одна из линий имеет соответствующий шаблон

Например, файл text.txt имеет следующие строки:

Error- Undefined port
line1
line2
Undefined port in ALU1 
line3

Error- Undefined port
line4
line5
Undefined port in LSU 
line6

Error- Undefined port
line7
line8
Undefined port in FGU 
line9 

Error- Undefined port
line10
line11
Undefined port in ALU2 
line12

я хочу распечатать строки между двумя последовательными вхождениями Слово «Ошибка» только тогда, когда одна из строк содержит слово «АЛУ».

, поэтому я просто хочу распечатать следующие сообщения об ошибках:

Error- Undefined port
line1
line2
Undefined port in ALU1 
line3

Error- Undefined port
line10
line11
Undefined port in ALU2 
line12

Ответы [ 4 ]

4 голосов
/ 09 июня 2011

Чтобы добиться этого, вам нужно выполнить ветвление в сценарии sed и удерживать буфер.

Скрипт использует два буфера: буфер шаблонов (это буфер, в котором sed хранит текущую обработанную строку и который используется для тестов на соответствие шаблону) и буфер хранения (буфер, предназначенный для хранения предыдущих строк). Идея состоит в том, чтобы сохранить все строки из последнего совпадения с шаблоном /Error/ и проверить наличие /ALU/ во время следующего совпадения /Error/ или конца потока.

sed -n '
# if /Error/ pattern occured, jump to /ALU/ check
/Error/ b alu_check
# else append current line to the hold buffer
H
# if the current line is the last one, jump to /ALU/ check
$ b alu_check
# otherwise jump to end of script (= finish processing of this line)
b
# alu_check:
:alu_check
# exchange current pattern buffer with hols buffer context
x
# print previous record if /ALU/ occured
/ALU/ p
'

x Порядок обменивает контекст буфера шаблона (текущая строка) с контекстом буфера хранения (что запоминается с прошлого раза) - обратите внимание, что он сохраняет текущую строку с / Error / pattern в буфере хранения в следующий раз

H добавляет текущий контекст строки в буфер удержания

2 голосов
/ 28 октября 2012

awk -v RS = -v ORS = "\ n \ n" '/ ALU /' file

2 голосов
/ 09 июня 2011

вариант awk:

 awk 'BEGIN{RS=ORS="\n\n";FS="\n"}/^Error.+ALU/' file

RS (разделитель записей) принудительно устанавливается в пустые строки

FS (Разделитель полей) при возврате в одну строку

ORS (Разделитель выходных записей) установлен на пустой строке для вывода (удалите это, если вам это не нужно)

/^Error.+ALU/ Если запись (блок текста) начинается с Error и содержит ALU -> распечатать блок.

0 голосов
/ 02 апреля 2012

Legacy:

awk '{FS="\n";RS=""} $0 ~ /ALU/ {print $0"\n"}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...