단어 수를 세고 다음 패턴과 정확히 일치하는 패턴 행을 인쇄하고 싶습니다.
abc-ERROR:
입력 파일에는 다음이 포함됩니다.
# abc-ERROR: xyxxkkfgfr
# def-Error: aaaaaa
# abc-ERROR.cpp
출력은 다음과 같아야 합니다.
1 (count)
# abc-ERROR: xyxxkkfgfr (line)
답변1
grep
를 사용하여 행 수와 행 수를 얻을 수 있습니다 grep -c
. 두 번 실행하는 것을 좋아하지 않으면 대체를 grep
사용하고 처리할 수 있습니다 tee
(여기에 bash 구문이 있습니다).
grep abc-ERROR: input.txt | tee >( wc -l )
답변2
이건 어때:
$ cat file
# abc-ERROR: xyxxkkfgfr
# abc-ERROR: xyxxkkfgfr
# abc-ERROR: xyxxkkfgfr
# def-Error: aaaaaa
# abc-ERROR.cp
# abc-ERROR: asdgsdgaaf
# abc-ERROR: asdgsdgaaf
# abc-ERROR: tttttttttq
$ awk '/abc-ERROR: /{a[$0]++}END{for(k in a) printf "%d\t(count)\n%s\t(line)\n",a[k],k}' file
1 (count)
# abc-ERROR: tttttttttq (line)
2 (count)
# abc-ERROR: asdgsdgaaf (line)
3 (count)
# abc-ERROR: xyxxkkfgfr (line)
답변3
나는 이 문제를 해결하기 위해 두 가지 접근 방식을 제안합니다.
1) bashrc/bash_profile에 함수를 배치하고 함수를 호출하는 별칭을 만듭니다(이 함수는 전역적으로 사용됩니다).
2) 쉘 스크립트 파일을 생성하거나 파일의 별칭을 생성할 수 있습니다.
#!/bin/bash
function matchString(){
REGEX="$1"
FILE="$2"
RESULTS=$(grep -n "$REGEX" $FILE | awk -F ":" '{print $2 "\tLine: " $1}')
COUNT=$(echo $RESULTS | wc -l)
echo "Count: $COUNT"
echo $RESULTS
}
matchString $1 $2
텍스트 파일(예: bash matchString.sh "abc-ERROR:" test.txt)에 대해 이를 호출하면 다음이 출력됩니다.
수량: 1
abc - 오류 줄: 1
--이 함수는 첫 번째 인수를 정규식 패턴으로 사용하여(비슷한 시나리오에서 재사용 가능) 해당 패턴에 대한 두 번째 인수로 호출된 파일을 검색합니다.
출력의 첫 번째 줄은 일치하는 모든 줄의 총 개수이고, 이후의 각 줄은 일치 항목이며, 그 뒤에는 해당 일치 항목의 줄 번호를 나타내는 탭 문자가 옵니다.