Печатать имена файлов, содержащие несколько строк

UDP не может иметь состояние - попробуйте без государственной оговорки.

Также имейте в виду, что если вы проверяете входящий трафик с помощью tcpdump, он будет прослушиваться ВНЕЗАПНО межсетевого экрана.

-2
18.04.2019, 16:24
4 ответа

Чтобы найти все имена файлов, оканчивающиеся на .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
6
28.01.2020, 05:14

Используйте

find. -type f -name "*.ext" -exec grep -q kwd1 {} \; -exec grep -q kwd2 {} \; -exec grep -l kwd3 {} \;
1
28.01.2020, 05:14

Использование рекурсивного 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

.

Примечание. :Это приведет к разрыву имен файлов, содержащих символы новой строки.

1
28.01.2020, 05:14

Вы можете запустить команду find, чтобы идентифицировать все целевые файлы, а затем запустить grepдля них, чтобы обнаружить файлы.

$ find. -name '*.ext' -type f -exec grep -Pqz '(?s:(?=.*kwd1.*)(?=.*kwd2.*)(?=.*kwd3.*))' \{\} \; -print 
0
28.01.2020, 05:14

Теги

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