Как найти общее количество вхождений текста и файлов с помощью команды find

если вы хотите использовать предложение if, оцените подсчет:

if (( `ls *.txt 2> /dev/null|wc -l` ));then...
6
05.05.2012, 01:53
4 ответа

Для вопроса 1 вы можете сделать следующее:

найти. -name "* .txt" | xargs grep -i "abc" | wc -l

Подсчитывает общее количество совпадений для abc во всех текстовых файлах.

И для вопроса 2 я придумал:

найти. -name "* .txt" -exec grep -i "abc" {} + | вырезать -d: -f1 | сортировать | uniq | wc -l

Это получает только уникальные имена файлов из списка совпадений и считает их (сортировка, вероятно, не нужна).


Как указано miracle173, grep поставляется с флагом «одно совпадение на файл», поэтому команду можно сократить до просто:

find. -name "* .txt" -exec grep -il "abc" {} + | туалет -l

6
29.04.2021, 00:55

Параметр grep -c - это то, что вам нужно здесь

find . -name \*txt | xargs grep -c -i "abc" | {
    total=0
    count=0 
    while IFS=: read name num; do 
        ((num > 0)) && ((count+=1))
        ((total+=num))
    done
    echo total=$total 
    echo count=$count
}

Фигурные скобки для группировки команд вокруг цикла , а необходимы для сохраните переменные в одной области для этой подоболочки.

3
29.04.2021, 00:55

Количество abc, содержащихся в файлах:

Чтобы подсчитать количество всех abc в файлах .txt, используйте grep -c и найдите и - в исключительных случаях - cat:

find . -name "*.txt" -exec cat {} + | grep -ic abc

Grep -c будет делать общий счет для вас - то, что я не нашел в ответе SigueSigueBen, который содержит необоснованные вызовы xargs , imho. Остальные 2 ответа, где мне тосковать. Я их не изучал и сам писать не стал бы.

Количество файлов, содержащих abc:

find . -name "*.txt" -exec grep -iq abc {} ";" -printf "1" | wc -c 

Это не приведет к ошибке с именами файлов (которые, я признаю, редко), содержащими символы новой строки в своем имени (что совершенно законно).

1
29.04.2021, 00:55
$ grep -R --include='*.txt' -c -i abc . | awk -F: ' 
           BEGIN {
                    totalCount=0;noOfFiles=0;
                 } 
                 { totalCount=totalCount+$2; 
                   if ( $2 > 0 ) 
                   {
                       noOfFiles+=1;
                   } 
                 } 
            END {
             print "Total number of times abc appears:"totalCount; 
             print "Total number of files which has abc in it:"noOfFiles
            } '

(ИЛИ)

Вывод ls не должен использоваться для анализа другими программами. См. Комментарий ниже.

$  ls -Rltr | awk '/.txt/{print $NF }' | xargs grep -c -i "abc" | awk -F: ' 
       BEGIN {
                totalCount=0;noOfFiles=0;
             } 
             { totalCount=totalCount+$2; 
               if ( $2 > 0 ) 
               {
                   noOfFiles+=1;
               } 
             } 
        END {
         print "Total number of times abc appears:"totalCount; 
         print "Total number of files which has abc in it:"noOfFiles
        } '


Result:
Total number of times abc appears:0
Total number of files which has abc in it:0
3
29.04.2021, 00:55

Теги

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