본문 바로가기
Linux

리눅스 wc -l 사용주의 및 고찰

by ahsung 2021. 3. 5.

wc -l을 사용할 경우, 간혹 실제 눈에 보이거나, IDE나 엑셀등에서 알려주는 열 숫자보다 적게 세는 경우가 존재한다.

 

 

"\n" (개행 문자)의 개수만을 센다. 그렇기 때문에 실제 마지막열 끝에 개행 문자가 없다면 실제 라인보다 1개 더 적게 개수를 센다

# 아래 코드는 사람이 보기에 3줄이지만, wc -l은 개행 문자가 2개이므로 2로 센다.

가나 \n(개행)

다라 \n(개행)

마바

 

다행히 vim을 비롯한 웬만한 리눅스 환경의 커맨드들은 마지막줄 출력 및 파일 저장시 마지막에 개행을 추가해주기 때문에 "wc -l"의 라인수가 정확하다.

(놀라운 사실은, vim은 바이너리 파일조차도 수정하게되면 마지막에 "개행"을 추가한다.) 

 

하지만, 다른 IDE  Rest API와 같은 경우 마지막에 개행을 추가하지 않고 원본 그대로 유지한체 EOF로 끝나는 경우도 다수 존재한다.

그렇기 때문에 항상 외부 커맨드와, 파일이 "wc-l" 명령어로 라인수가 정확하게 세진다는 보장이 없다.

그래서 쉘스크립트 작성시 wc -l을 이용한 로직을 사용한다면, wc -l이 항상 목적에 맞게 일관되게 개수를 셀 필요성이 있다.

 

 

파일 및 외부 커맨드를 정확하게 line을 세는 일관된 방법

  • 커맨드의 경우 : echo "$(커맨드)" | wc -l
  • 파일의 경우 : echo "$(cat 파일)" | wc -l
  • 변수의 경우 : echo "$(echo "$var" )" | wc -l

 

$()로 명령어 결과를 감싸고 ""로 표현하게되면, 일괄적으로 마지막에 존재하는 연속된 모든 개행을 제거시킨다.

즉 vim 및 여러 커맨드에서 예쁜 출력을 위해 마지막에 추가한 개행이 삭제된다.

그리고 echo 명령어는 개행을 한 개 추가하기 때문에, 일반적으로 사람이 인식하는 것에 맞는 라인의 숫자를 셀수 있다.

 

 

 

 

 

 대안 명령어

  • awk 'END{print NR}' [file]
  • sed -n '$=' [file]  (GNU sed)

 

그냥 위 두 명령어를 사용하는 것도 추천.

마지막에 연속적으로 나오는 개행도 포함하여, 일반적으로 사람이 보는 라인의 수 만큼 세준다.

댓글