поиск нескольких строк в строке

"отображение $DISPLAY на C в $DISPLAY на B" что это значит?

Очевидно, grepчто-то у вас на C отсутствует, поэтому вы видите только сокеты на C, которые включают «номер порта = 6010». Другое соединение или сокет прослушивания на C отключены grep.

Раньше вы не видели никаких подключений, потому что не было запущено ни одного X-клиента, подключенного к sshd (номер порта = 6010 ), и дополнительная информация после того, как вы теперь запускаете X-клиент, который подключен к вашему sshd (порту num=6010 ).

При использовании туннеля SSH необходимо знать топологию сети. Сервер SSH на C открывает новый сокет, который прослушивает порт 6010, потому что его запросил клиент SSH на B. Туннель ssh по-прежнему установлен между клиентом SSH на B и сервером SSH на C (, порт num=22, если sshd специально не настроен ), вы не видите это туннельное соединение, так как вы grepего отключили. X-клиенты на C подключаются к sshd (номер порта = 6010 ), затем sshd мультиплексирует эти соединения с помощью ssh-туннеля и перенаправляет эти соединения на X-сервер на B.

«Соединение между $DISPLAY на C и $DISPLAY на B» на самом деле не существует, туннель ssh создается между C :22 и адресом _из __SSH _клиент _на _B. И поскольку это соединение, это невозможно в состоянии ПРОСЛУШИВАНИЯ.

используйте netstat -apбез grepдля просмотра дополнительной информации.

Все соединения, упомянутые в этом ответе, означают настоящее TCP-соединение с точки зрения ядра, а не «соединения» с точки зрения конечных -пользователей.

0
24.06.2020, 17:43
2 ответа

Чтобы найти 2 строки в строке:

Использование GNU grep с Perl -совместимыми регулярными выражениями:

grep -RinP '^(?=.*\bMiami\b)(?=.*\bNew York City\b)' dir/

Регексы Perl используют \bв качестве границы слова.

С GNU awk:

gawk -v IGNORECASE=1 '
    /\<Miami\>/ && /\<New York City\>/ {
        print FILENAME ":" NR ":" $0
    }
' file

Расширенные регулярные выражения используют \<и \>в качестве границ слов.

Однако в awk нет эквивалента -R. Вы можете использовать find:

find dir/ -type f -exec gawk -v IGNORECASE=1 '...' '{}' +
1
18.03.2021, 23:24

Следующее решение доступно в связанной публикации @steeldriver, любезно предоставленной @Campa.

grep -Rinw Miami. | grep -iw "new york city"

Просто добавьте несколько переключателей, чтобы получить рекурсивный поиск и вывод

Использование

Miami banana
Miami New York City
Miami banana
New York City banana
Miami banana
New York City Miami

если у вас большое количество файлов, то избегать Perl с grepкажется хорошей идеей

time grep -Rinw Miami. | grep -iw "new york city"
./file:2:Miami New York City
./file:6:New York City Miami

real    0m0.014s
user    0m0.004s
sys     0m0.016s

time grep -RinwP Miami. | grep -iwP "new york city"
./file:2:Miami New York City
./file:6:New York City Miami

real    0m0.059s
user    0m0.060s
sys     0m0.004s

Похоже, timeпреимущество вышеизложенного над @glennjackman с Perl

time grep -RinP '^(?=.*\bMiami\b)(?=.*\bNew York City\b)'.
./file:2:Miami New York City
./file:6:New York City Miami

real    0m0.069s
user    0m0.062s
sys     0m0.007s

И повторяя эти 1000 раз по одному и тому же поиску for i in {1..1000}; do....; done, похоже, подтверждается

@glennjackman PЭрлgrep

real    0m49.276s
user    0m47.414s
sys     0m1.790s

@Campa Pэрлgrep

real    0m42.841s
user    0m42.305s
sys     0m3.346s

@Campa простойgrep

real    0m8.813s
user    0m8.837s
sys     0m3.081s

Но победителем в спринте на 1000 повторений стал @glennjackmanawk

real    0m2.975s
user    0m2.259s
sys     0m0.772s
0
18.03.2021, 23:24

Теги

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