Grep сопоставление ВСЕХ элементов из файла шаблона

Я не уверен, что именно вы пытались (вы не указали ), но я могу заставить два сервера pulseaudio обмениваться данными через многоадресный RTP следующим образом.

Об отправителе,

pacmd load-module module-rtp-send source=name_of_mic_source destination_ip=232.43.211.230 inhibit_auto_suspend=always

где name_of_mic_source— источник, подключенный к микрофону для тестирования (используйте pamcd list-sources | grep name:для просмотра имен, игнорируйте угловые скобки ).

На приемнике,

pacmd load-module module-null-sink sink_name=rtpsink
pacmd load-module module-rtp-recv sink=rtpsink sap_address=232.43.211.230

Это создает «нулевой» приемник, который я могу контролировать с помощью pavucontrol, чтобы убедиться, что шумы, которые я издавал перед микрофоном, проходят. Wireshark проверяет, что пакеты действительно многоадресные.

Также работает без destination_ipсоотв. sap_address, и в этом случае будет использоваться многоадресная группа 224.0.0.56по умолчанию. Однако эта группа является локальной по ссылке -, поэтому она не будет маршрутизироваться, и для ее работы оба компьютера должны находиться в одном сегменте.

Это была тестовая установка. Чтобы перенаправить звук от vlcи т. д., я бы создал нулевой приемник на отправителе, позволил vlcвоспроизводиться в этот приемник, использовал связанный источник rtpsink.monitorдля module-rtp-sendи подключил module-rtp-recvнапрямую к слышимый слив на ресивере.

Я не пробовал это с потоком RTP -, непосредственно созданным vlc, но если вы опишете свою настройку, я тоже могу это проверить. Если что-то пойдет не так, следует сравнить объявления SDP/SAP с Wireshark, чтобы увидеть, есть ли проблема.

0
04.12.2019, 12:25
3 ответа

Если я вас правильно понял, это может быть вариантом (, если моя логика верна ). Здесь я предполагаю, что шаблоны уникальны для каждого файла :

.
grep -R < file_with_patterns. | cut -d':' -f1 | uniq -d

grepвернет две строки, если два шаблона совпадают, или только одну, или ни одной. Воспользовавшись этой ситуацией, мы используем uniq -d, чтобы показать только повторяющиеся результаты имен файлов.

0
28.01.2020, 02:38

Не совсем одна команда, но:

num_patterns=$( wc -l < patterns_file )
for file in dir/*; do
    num_occurrances=$( grep -F -o -f patterns_file "$file" | sort -u | wc -l )
    if (( num_patterns == num_occurrances )); then
        echo "all patterns in $file"
    fi
done

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

1
28.01.2020, 02:38

Предположим, что ./*.txtсоответствует всем файлам, которые вас интересуют, и что вы хотите найти файлы, содержащие все из строк в файле./patterns(может содержать более двух строк):

#!/bin/bash

pathnames=(./*.txt )

while IFS= read -r pattern; do
    for pathname in "${pathnames[@]}"; do
        pathnames=( ${pathnames[@]:1} )

        if grep -qF -e "$pattern" "$pathname"; then
            pathnames+=( "$pathname" )
        fi
    done
done <./patterns

printf 'Matched: %s\n' "${pathnames[@]}"

Циклическое перебор паттернов. Для каждого шаблона он проверяет его на соответствие всем файлам в массиве pathnames. Если шаблон совпадает, мы сохраняем текущий путь в массиве, в противном случае он отбрасывается. В конце pathnamesбудут содержать только пути, содержащие все шаблоны.

Из-за способа управления массивом pathnamesколичество вызовов grep, сделанных для каждого шаблона, будет уменьшаться по мере того, как отбрасывается все больше и больше файлов.

Команда pathnames=( ${pathnames[@]:1} )удалит первый (текущий )путь из массива, а pathnames+=( "$pathname" )вернет его обратно в конец.

Команда grep -qF -e "$pattern" "$pathname"вернет значение true , если файл $pathnameсодержит строку в $pattern. Мы используем -q, чтобы сделать grepтихим, а также заставить его выйти, как только он совпадет с шаблоном в файле. Мы используем -Fдля сравнения строк, а не для сопоставления регулярных выражений.


Только потому, что краткий синтаксис shмне нравится больше, чем именованные массивы в bash, вот вариант вышеприведенного для/bin/sh(позиционные параметры заменяют массив pathnames):

#!/bin/sh

set --./*.txt

while IFS= read -r pattern; do
    for pathname do
        shift

        if grep -qF -e "$pattern" "$pathname"; then
            set -- "$@" "$pathname"
        fi
    done
done <./patterns

printf 'Matched: %s\n' "$@"
0
28.01.2020, 02:38

Теги

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