если вы хотите использовать предложение if, оцените подсчет:
if (( `ls *.txt 2> /dev/null|wc -l` ));then...
Для вопроса 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
Параметр 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
}
Фигурные скобки для группировки команд вокруг цикла , а
необходимы для сохраните переменные в одной области для этой подоболочки.
Чтобы подсчитать количество всех abc в файлах .txt, используйте grep -c и найдите и - в исключительных случаях - cat:
find . -name "*.txt" -exec cat {} + | grep -ic abc
Grep -c будет делать общий счет для вас - то, что я не нашел в ответе SigueSigueBen, который содержит необоснованные вызовы xargs
, imho. Остальные 2 ответа, где мне тосковать. Я их не изучал и сам писать не стал бы.
find . -name "*.txt" -exec grep -iq abc {} ";" -printf "1" | wc -c
Это не приведет к ошибке с именами файлов (которые, я признаю, редко), содержащими символы новой строки в своем имени (что совершенно законно).
$ 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