특정 개수 이상의 모든 개수와 일치하는 명령을 찾으려고 합니다. 나는 사용하고있다
grep -src 'Bicycle' /cygdrive/c/Documents/* |grep -v ':0$'
출력은 다음과 같습니다
/cygdrive/c/Documents/blahhh.txt:1
/cygdrive/c/Documents/blahhh.txt:3
/cygdrive/c/Documents/bla0.txt:5
/cygdrive/c/Documents/blahg.txt:23
그러나 나는 그것이 출력되기를 원합니다 :
/cygdrive/c/Documents/blahg.txt:23
나는 이것을 많이 검색했습니다. 누구든지 나를 올바른 방향으로 인도해 줄 수 있다면 좋을 것 같습니다.
답변1
간단한 방법은 grep
출력을 파이프로 연결 awk
하고 구분 기호를 다음과 같이 설정하여 구문 분석하고 마지막 필드 수가 정의하려는 필드 수 :
보다 큰지 확인하는 것입니다.X
grep -src 'Bicycle' /cygdrive/c/Documents/* | awk -F: '$NF+0 > 1'
위의 예에서는 보다 큰 항목을 제거했습니다 1
. 필요에 따라 수정하세요.
$NF+0 > 1
just로 끝나는 이유는 $NF > 1
순전히 숫자 평가를 하기 위함인데, 빈 문자열이나 숫자 문자열이 있는 경우를 고려하여 0
이를 올바른 숫자에 추가하여 비교하고, 그렇지 않으면 비교 양쪽의 유형이 올바르지 않습니다.
어떤 이유로 숫자를 문자열로 강제 변환해야 하는 경우 숫자를 빈 문자열과 연결하세요
""
. 문자열을 숫자로 변환하려면 문자열에 0을 추가하세요.
답변2
GNU 사용 awk
:
awk -v min=10 '
BEGINFILE{n=0}
/Bicycle/ {n++}
ENDFILE{if (n >= min) print FILENAME":"n}' /cygdrive/c/Documents/*
수량을 계산한다는 점에 유의하세요.철사포함 Bicycle
(발생 횟수가 아님)Bicycle
단어. 이렇게 하려면 다음이 필요합니다.
awk -v min=10 '
BEGINFILE{n=0}
{n += gsub(/Bicycle/, "&")}
ENDFILE{if (n >= min) print FILENAME":"n}' /cygdrive/c/Documents/*
재귀 검색의 경우:
find /cygdrive/c/Documents -type f -exec awk -v min=10 '
BEGINFILE{n=0}
/Bicycle/ {n++}
ENDFILE{if (n >= min) print FILENAME":"n}' {} +
답변3
방법 1
grep -c "Bicycle" * |sed -r "s/\s+//g" | awk -F ":" '{print $1,$2}' | sort -nr -k2| head -1
방법 2
여기서는 개수가 3보다 큰 파일을 표시하는 것을 고려합니다.
grep -c "Bicycle" * |sed -r "s/\s+//g" | awk -F ":" '$2 > "3"{print $1,$2}'