З 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