Если вы знаете номера строк, которые хотите искать (как предполагает ваш Q), подтяните regex, чтобы не совпадали ненужные строки.
Например, измените:
sed -n '/11/,/14/p' | grep NAME | awk -F "= " '{print $2}'
на
sed -n '/^11 /,/^14 /p' | grep NAME | awk -F "= " '{print $2}'
^
будет соответствовать началу строки, а пробел после номера гарантирует, что будет соответствовать определенный номер строки, и вы не будете обрабатывать ненужные блоки.
Используйте границы слов:
grep '\bNAME1\b'
будет соответствовать NAME1
, а не NAME1XYZ
или XYZNAME1
.
Аналогично,
sed -n '/11\b/,/14\b/p'
не будет соответствовать строкам, содержащим 111
и 142
.
EDIT: Похоже, что номера во входном файле на самом деле являются номерами строк. Если это так, вы можете просто сказать:
sed '11,14!d'
чтобы получить нужные строки.
sed не подходит для этой работы. Используйте awk, где вы можете указать идентификатор, который вы ищете, и распечатать следующее появившееся ИМЯ.
awk -v id="id2" '
$NF == id {have_id = 1}
have_id && $0 ~ /NAME/ {print $NF; exit}
' filename
Для этого не нужен никакой другой инструмент, sed
легко справится с этим целиком.
sed -nr '/11/,/14/{s/^.*NAME =\s*(\S*).*$/\1/p}' <$infile
Это должно предоставить вам только первую последовательность непробельных символов после фразы «NAME =» для каждой строки, в которой эта фраза находится между строками 11 и 14 любого входного файла sed
is кормили.
Вы можете использовать AWK
awk 'NR>=13 && NR<=17 && /NAME/{print $NF}' infile
Это будет искать строки между 13 и 17, затем искать имя, и если совпадение, оно будет печатать последнее слово из Name = LastWord
вы можете распечатать те строки, которые содержат совпадающий шаблон, используя sed следующим образом:
sed -n '/pattern/p' Filename
-n
- эти параметры отключают эту автоматическую печать, и только sed
производит вывод, если явно указано через p
команда.
p
- print