UDP не может иметь состояние - попробуйте без государственной оговорки.
Также имейте в виду, что если вы проверяете входящий трафик с помощью tcpdump, он будет прослушиваться ВНЕЗАПНО межсетевого экрана.
Чтобы найти все имена файлов, оканчивающиеся на .ext
и содержащие три ключевых слова kwd1
, kwd2
и kwd3
, в любом месте текущего каталога или ниже него:
find. -name '*.ext' -name '*kwd1*' -name '*kwd2*' -name '*kwd3*'
Или, установив ключевые слова более динамичным образом,
set -- "kwd1" "kwd2" "kwd3"
for word do
set -- "$@" -name "*$word*"
shift
done
find. -name "*.ext" "$@" -print
Или, если вы хотите найти ключевые слова внутри файлов:
set -- "kwd1" "kwd2" "kwd3"
for word do
set -- "$@" -exec grep -q -wF -e "$word" {} ';'
shift
done
find. -name "*.ext" "$@" -print
Я использую -wF
с grep
здесь только для сравнения строк(-F
)целых слов(-w
)в файлах.
В оболочке, поддерживающей именованные массивы, последний фрагмент кода может выглядеть так:
keywords=( "kwd1" "kwd2" "kwd3" )
and_expr=()
for word in "${keywords[@]}"; do
and_expr+=( -exec grep -q -wF -e "$word" {} ';' )
done
find. -name "*.ext" "${and_expr[@]}" -print
Используйте
find. -type f -name "*.ext" -exec grep -q kwd1 {} \; -exec grep -q kwd2 {} \; -exec grep -l kwd3 {} \;
Использование рекурсивного grep и чтения:
grep --include '*.ext' -lr 'kwd1'. |
while read -r file; do grep -m1 -q 'kwd2' "$file" && grep -m1 -l 'kwd3' "$file"; done
grep --include '*.ext' -lr 'kwd1'.
-Будут найдены все файлы (рекурсивно )в текущем каталоге, которые заканчиваются на .ext
и содержатkwd1
Затем цикл while возьмет каждый файл, содержащий kwd1
, и подтвердит, что он также содержит как kwd2
, так и kwd3
Примечание. :Это приведет к разрыву имен файлов, содержащих символы новой строки.
Вы можете запустить команду find
, чтобы идентифицировать все целевые файлы, а затем запустить grep
для них, чтобы обнаружить файлы.
$ find. -name '*.ext' -type f -exec grep -Pqz '(?s:(?=.*kwd1.*)(?=.*kwd2.*)(?=.*kwd3.*))' \{\} \; -print