wc -w 명령이 잘못된 답변을 출력합니다.

wc -w 명령이 잘못된 답변을 출력합니다.

파일에서 shell이라는 단어가 몇 번이나 사용되었는지 알아내야 합니다. 단어가 몇 번이나 사용되었는지 세어 봤는데 grep "shell" test.txt | wc -w결과는 3이 아닌 4였습니다. 파일 내용은 다음과 같습니다.

this is a test file
for shell_A
shell_B
sh
shel
and 
shell_C
script project

답변1

wc 명령은 "for"를 포함하여 grep 출력의 단어 수를 계산합니다.

> grep shell test.txt
for shell_A
shell_B
shell_C

그래서 실제로 4개의 단어가 있습니다.

특정 단어가 포함된 파일의 줄 수만 계산하려면 -cgrep 옵션을 사용할 수 있습니다. 예를 들어 다음과 같습니다.

grep -c shell test.txt

이 중 어느 것도 실제로 중요하지 않습니다.성격, 그러나 다음을 포함한 다른 콘텐츠와 일치할 수 있습니다.. 대부분의 grep구현(GNU grep, 최신 BSD 및 AIX, HPUX, Solaris)은 -w단어 옵션을 제공하지만저것POSIX에는 없습니다. 또한 정규식도 인식합니다. 예를 들면 다음과 같습니다.

grep -e '\<shell\>' test.txt

-w옵션에 해당합니다. 다시,저것POSIX에는 없습니다. 과연 솔라리스문서이러한 이유로 AIX 및 HPUX 설명에서는 -w정규식에 대해 언급하지 않습니다. 이것들은 모두 일관되게 보입니다. "단어"를 밑줄 친 영숫자 문자의 시퀀스로 생각하세요.

grep과 함께 POSIX 정규식을 사용하여 단어(공백 등으로 구분)를 일치시킬 수 있지만 예제 중 어느 것도 단순한 "쉘"이 아닙니다. 모두 일치하는 다른 문자가 있습니다. 또는 영숫자에만 관심이 있는 경우(그리고아니요밑줄) 하위 문자열을 일치시켜도 괜찮습니다.

tr -c '[[:alnum:]]' '\n' test.txt |grep -c shell

제안된 옵션 -o은 POSIX가 아니며 OP가 질문을 Linux나 BSD로 제한하지 않았기 때문에 권장하는 옵션은 아닙니다. 두 경우 모두 일치하지 않습니다.성격, 하지만(이것은 OP의 기대입니다).

참고로:

답변2

"grep" 명령은 "shell"이 나타나는 전체 줄을 출력합니다. 단지 "쉘"이라는 단어가 아닙니다. 다음과 같이:

grep shell test.txt
for shell_A
shell_B
shell_C

이 옵션을 사용하는 것이 좋습니다

-o, --match만 해당

그래서:

grep -o "shell" test.txt | wc -w

답변3

"shell"이라는 단어는 한 줄에 여러 번 나타날 수 있으므로 먼저 텍스트를 한 줄에 한 단어로 나눈 다음 grep을 수행합니다.

< test.txt tr -s "[[:blank:]]" "\n" | grep "shell" | wc -w

을(를) 사용 wc -l하거나 취소 wc하고 사용할 수도 있습니다.grep -c "shell"

tr자신이 소유하고 사용하는 파일이 필요하지 않도록 할 수도 있습니다.

grep -c "쉘" test.txt

답변4

wc -l이것을 사용해야 합니다 (예: grep shell test.txt | wc -l3을 반환).

관련 정보