grep для одного или нескольких вхождений слова

Я думаю, что одна из причин заключается в том, что большинству пользователей необходимо иметь возможность использовать эфемерные порты для подключения к другим серверам, не обязательно являясь root.

Соединение TCP / IPv4 состоит из двух конечных точек, и каждая конечная точка состоит из IP-адреса и номера порта. Следовательно, когда пользователь-клиент подключается к компьютеру-серверу, установленное соединение можно рассматривать как набор из 4 элементов (IP-адрес сервера, порт сервера, IP-адрес клиента, порт клиента). Обычно три из четырех легко известны - клиентская машина использует свой собственный IP-адрес, а при подключении к удаленной службе требуются IP-адрес серверной машины и номер порта службы.

Что не сразу очевидно, так это то, что когда соединение установлено, клиентская сторона соединения использует номер порта. Если клиентская программа явно не запрашивает конкретный номер порта, {{ 1}} используемый номер порта является временным номером порта. Эфемерные порты - это временные порты, назначаемые стеком IP-адресов машины, и назначаются из указанного диапазона портов для этой цели. Когда соединение завершается, временный порт доступен для повторного использования, хотя большинство IP-стеков не будут повторно использовать этот номер порта до тех пор, пока не будет использован весь пул временных портов . Таким образом, если клиентская программа повторно подключается, ей будет назначен другой временный номер порта для ее стороны нового подключения.

0
24.09.2018, 18:14
1 ответ

По умолчанию grepиспользует базовые регулярные выражения BRE (), что означает, что специальные символы, такие как +, будут интерпретироваться как литеральные символы. Следовательно, в GNU grep его нужно экранировать, т.е. записать как \+. (В качестве альтернативы можно использовать расширенное регулярное выражение ERE ()с флагом -E; см. man grepдля получения дополнительной информации. )Следовательно, ваша команда может быть написана так:

grep -nr '[s][u][p][e][r][(][A-Za-z]\+'

Кроме того, […]вокруг каждой буквы не требуется. […]используется для указания класса символов, например. [ab]может соответствовать либо a, либоb. Если в […]есть одна буква, то это единственное совпадение. Следовательно, ваш код можно упростить до

grep -nr 'super([A-Za-z]\+'

Н.Б. Согласно комментарию Stéphane Chazelas , конструкция \+является расширением GNU. Если это не сработает, вы можете вместо этого попробовать \{1,\}.

6
28.01.2020, 02:42

Теги

Похожие вопросы