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)
그냥 위 두 명령어를 사용하는 것도 추천.
마지막에 연속적으로 나오는 개행도 포함하여, 일반적으로 사람이 보는 라인의 수 만큼 세준다.
'Linux' 카테고리의 다른 글
linux hostname / 리눅스 호스트네임 (초안) (0) | 2023.03.27 |
---|---|
CentOS 7 다중 default route/gateway 설정 (0) | 2023.03.24 |
동일 Inode file의 fileSystem 확인 ps, 커널 의사 파일시스템(pseudo filesystem) (0) | 2021.11.08 |
댓글