Вдохновленный отличным ответом @Stephen Kitts, я написал немного более общий сценарий для выполнения сопоставления блоков при наличии заданного начального и конечного шаблонов.
#!/usr/bin/awk -f
BEGIN {
pstart=ARGV[1];
pstop=ARGV[2];
pmatch=ARGV[3];
ARGV[1]=ARGV[4];
ARGC=2;
}
$0 ~ pstart { block = $0; output = 0; next }
{ block = block "\n" $0 }
$0 ~ pmatch { output = 1 }
$0 ~ pstop && output { print block; output = 0 }
Использование:match_block START END MATCH [FILE]
./match_block '^ID' 'Configured Voltage' 'Location Tag: P1-DIMMD1' f
или
command |./match_block '^ID' 'Configured Voltage' 'Location Tag: P1-DIMMD1'
Спасибо, что предложили написать это как скрипт awk
. Мой исходный сценарий оболочки был:
#!/bin/sh
[ -z "$4" ] && file="-" || file="$4"
awk \
-v BLOCKSTART_PATTERN="$1" \
-v BLOCKEND_PATTERN="$2" \
-v BLOCKMATCH_PATTERN="$3" \
'
$0 ~ BLOCKSTART_PATTERN { block = $0; output = 0; next }
{ block = block "\n" $0 }
$0 ~ BLOCKMATCH_PATTERN { output = 1 }
$0 ~ BLOCKEND_PATTERN && output { print block; output = 0 }
' "$file"
Использование:match_block START END MATCH [FILE]
.
Если файл не указан, будет использоваться stdin
.
В вашем случае:
command |./match_block '^ID' 'Configured Voltage' 'Location Tag: P1-DIMMD1'
или
./match_block '^ID' 'Configured Voltage' 'Location Tag: P1-DIMMD1' file