З grep -o
, вам доведеться відповідати саме тому, що ви хочете витягти. Оскільки ви не хочете витягувати proto=
рядок, вам не слід відповідати.
Розширений регулярний вираз, який би відповідав tcp
або udp
слідом за косою рисою, і деякою непустою буквено-цифровою строкою
(tcp|udp)/[[:alnum:]]+
Застосовуючи це у своїх даних:
$ grep -E -o '(tcp|udp)/[[:alnum:]]+' file
tcp/http
tcp/https
udp/dns
Щоб переконатися, що ми робимо це лише в рядках, що починаються з рядка proto=
:
grep '^proto=' file | grep -E -o '(tcp|udp)/[[:alnum:]]+'
З sed
, видаляючи все до першого =
та після першого порожнього символу:
$ sed 's/^[^=]*=//; s/[[:blank:]].*//' file
tcp/http
tcp/https
udp/dns
Щоб переконатися, що ми робимо це лише в рядках, що починаються з рядка proto=
, ви можете вставити той же крок попередньої обробки, що grep
і вище, або ви можете використовувати
sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file
Тут ми придушуємо вихідний -n
параметр за замовчуванням за допомогою параметра, а потім запускаємо підстановки та явний друк рядка, лише якщо рядок збігається ^proto=
.
З awk
, використовуючи роздільник поля за замовчуванням, а потім розділити перше поле на=
друк і друкуючи другий біт:
$ awk '{ split($1, a, "="); print a[2] }' file
tcp/http
tcp/https
udp/dns
Щоб переконатися, що ми робимо це лише в рядках, що починаються з рядкаproto=
, ви можете вставити той же крок попередньої обробки, що grep
і вище, або ви можете використовувати
awk '/^proto=/ { split($1, a, "="); print a[2] }' file