다음과 같이 구성된 파일 디렉토리가 있습니다.
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