find
특정 텍스트 문자열의 총 발생 횟수와 해당 텍스트 문자열이 포함된 파일 수를 찾는 명령을 실행하려고 합니다 .
지금 내가 가지고 있는 것은 이 명령입니다.
find . -name "*.txt" | xargs grep -i "abc"
"abc"라는 텍스트가 포함된 모든 "*.txt" 파일을 보고합니다. 하나 또는 두 개의 찾기 명령을 가져오고 싶습니다.
- abc의 총 발생 횟수
- abc를 포함하는 총 파일 수입니다.
답변1
질문 1의 경우 다음과 같이 할 수 있습니다.
find . -name "*.txt" | xargs grep -i "abc" | wc -l
총 일치 횟수를 계산합니다.알파벳모든 텍스트 파일에서.
질문 2의 경우 다음과 같이 생각해 냈습니다.
find . -name "*.txt" -exec grep -i "abc" {} + | cut -d: -f1 | sort | uniq | wc -l
이는 일치 목록에서 고유한 파일 이름을 가져와서 개수를 셉니다(정렬이 필요하지 않을 수 있음).
Miracle173이 지적했듯이 grep
"파일당 한 번 일치" 플래그를 사용하면 명령을 다음과 같이 단축할 수 있습니다.
find . -name "*.txt" -exec grep -il "abc" {} + | wc -l
답변2
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
}
while
하위 쉘의 범위 내에서 변수를 유지하기 위해 루프 주위에서 명령을 그룹화하려면 중괄호가 필요합니다 .
답변3
$ 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
답변4
파일에 포함된 abc 수:
.txt 파일에 있는 모든 "abc"의 수를 계산하려면 grep -c를 사용하고 cat을 찾아 제외하세요.
find . -name "*.txt" -exec cat {} + | grep -ic abc
Grep -c가 총계를 계산합니다. IMHO에 대한 불합리한 호출이 포함된 SigueSigueBen의 답변에서 이 답변을 찾지 못했습니다 xargs
. 다른 두 사람은 내가 갈망했던 곳에 대답했습니다. 나는 그것들을 연구한 적도 없고, 나 자신도 그런 글을 쓰지 않을 것입니다.
abc를 포함하는 파일 수:
find . -name "*.txt" -exec grep -iq abc {} ";" -printf "1" | wc -c
이름에 개행 문자가 포함된 파일 이름(제가 인정하는 경우는 드뭅니다)(완전히 합법적임)에 대해서는 이 작업이 실패하지 않습니다.