![단어 수를 세고 주어진 패턴과 정확히 일치하는 줄을 인쇄하는 방법은 무엇입니까?](https://linux55.com/image/31114/%EB%8B%A8%EC%96%B4%20%EC%88%98%EB%A5%BC%20%EC%84%B8%EA%B3%A0%20%EC%A3%BC%EC%96%B4%EC%A7%84%20%ED%8C%A8%ED%84%B4%EA%B3%BC%20%EC%A0%95%ED%99%95%ED%9E%88%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%EC%A4%84%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
단어 수를 세고 다음 패턴과 정확히 일치하는 패턴 행을 인쇄하고 싶습니다.
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
--이 함수는 첫 번째 인수를 정규식 패턴으로 사용하여(비슷한 시나리오에서 재사용 가능) 해당 패턴에 대한 두 번째 인수로 호출된 파일을 검색합니다.
출력의 첫 번째 줄은 일치하는 모든 줄의 총 개수이고, 이후의 각 줄은 일치 항목이며, 그 뒤에는 해당 일치 항목의 줄 번호를 나타내는 탭 문자가 옵니다.