여러 문자열을 grep하고, 줄 수를 계산하고, 각 문자열의 출력을 에코합니다.

여러 문자열을 grep하고, 줄 수를 계산하고, 각 문자열의 출력을 에코합니다.

다음과 같이 구성된 파일 디렉토리가 있습니다.

data/directory1/file1.xml
data/directory2/file2.xml
data/directory3/file3.xml
...

data/에는 각각 xml 파일이 있는 수천 개의 하위 디렉터리가 있습니다.

데이터를 재귀적으로 스캔하고 세 가지 패턴을 찾은 다음 (이상적으로는) 각 패턴 앞에 레이블을 사용하여 패턴 일치 수를 에코하고 싶습니다. 그래서 내 결과를 보고 싶습니다.

Pattern 1 = 20
Pattern 2 = 100
Pattern 3 = 432

나는 이것을 한 번에 실행하는 데 사용할 수 있었습니다:

grep -E -r 'Pattern 1' data/ | wc -l
grep -E -r 'Pattern 2' data/ | wc -l
grep -E -r 'Pattern 3' data/ | wc -l 

이제 나는 이 모든 것을 data/의 상위 디렉토리가 될 하나의 매개변수를 사용하여 쉘 스크립트에 넣으려고 합니다. 그런 다음 각 패턴의 개수를 표준 출력 또는 count.txt로 인쇄합니다.

당신의 도움을 주셔서 감사합니다!

답변1

확인해 보세요 grep -c. 설명과 일치합니다. 더 많은 유연성이 필요한 경우 다음과 같이 시도해 볼 수 있습니다 awk(테스트하지 않고 브라우저에 직접 입력).

dir=$1
# add tests to check if $1 exists (-d) and/or is non null (-n)

find "${dir}" | awk <<\EOF

BEGIN {
   pat1 = 0;
   pat2 = 0;
   ...
}

/pattern/ { pat1 += 1;}
/otherpattern/ {pat2 += 2;}
...

END {
   print "pattern", pat1;
   print "otherpattern", pat2;
   ...
}
EOF

find명령이나 스크립트 awk의 세부 사항을 파악하는 것은 여러분에게 맡기겠습니다 .

답변2

다음 스크립트는 패턴을 반복하고 각 패턴에 대한 총 일치 수를 인쇄합니다. 이름이 인수로 전달된 디렉터리에서 검색하고, 인수가 전달되지 않은 경우 현재 디렉터리에서 검색합니다.

#!/bin/sh
for p in 'Pattern 1' 'Pattern 2' 'Pattern 3; do
  printf '%s = ' "$p"; grep -E -r -e "$p" "${1:-.}/data" | wc -l
done

관련 정보