
У меня есть файл, в котором имена находятся в первой позиции символа. Я пытаюсь найти способ grep всех имен. Например, я хотел бы, чтобы имена BUBBA и SUSAN были перечислены.
BUBBA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = bubba01)(PORT = xxxx))
)
(CONNECT_DATA =
(SERVICE_NAME = bubba01)
)
)
SUSAN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = susan01)(PORT = xxxx))
)
(CONNECT_DATA =
(SID = susandb)
)
)
решение1
Похоже, вы просто хотите:
grep -o '^[A-Z]\+'
-o
означает вывод только совпадающей части строки, а регулярное выражение сопоставляет последовательность из одной или нескольких заглавных букв в начале строки.
Вы также можете сделать то же самое с помощью sed
, что слишком сложно для этого примера, но полезно (и проще, чем awk
или perl
), если вам нужно выполнить более сложное сопоставление или преобразование:
sed -n '/^[A-Z]\+/{s/^\([A-Z]\+\).*/\1/;p}'
решение2
С использованием awk
:
awk 'NF > 1 && $1 !~ /^\(|\)/ {print $1}' file
Печатать только строки, содержащие хотя бы одно поле ( NF > 1
), и игнорировать строки, начинающиеся с (
или )
: ^\(|\)
.
решение3
Если все входные файлы отформатированы одинаково, то для простого решения awk:
awk '/^[a-Z]/ {print $1}' filename
Использование carrat ( ^
) выберет только записи, которые имеют символ в начале каждой строки. Затем выведет только первое поле, игнорируя =
.