POSIX wc
명령은 파일의 POSIX 라인 수를 계산합니다. POSIX 표준은 다음을 정의합니다.철사접미사가 붙은 텍스트 문자열 \n
. 그것이 없으면 \n
일반 텍스트 문자열은 줄이라고 할 수 없습니다.
하지만 나에게는 파일에 몇 줄의 텍스트 문자열이 있는지 계산하는 것이 더 자연스럽게 느껴집니다. 이를 수행하는 쉬운 방법이 있습니까?
root:[~]# printf "aa\nbb" | wc -l
1
root:[~]# printf "aa\nbb\n" | wc -l
2
root:[~]#
답변1
GNU를 사용하면 sed
다음을 사용할 수 있습니다.
sed '$=;d'
GNU는 sed
마지막 줄 바꿈 뒤의 추가 문자를 추가 줄로 처리하기 때문입니다. 대부분의 GNU 유틸리티와 마찬가지로 GNU는 sed
입력 시 NUL 문자를 지원하며 줄 길이에 제한이 없습니다(두 조건 모두 POSIX에 따라 입력을 텍스트가 아닌 것으로 만듭니다).
POSIXly 기반@Inian의 답변지나치게 긴 줄과 NUL 바이트를 지원합니다.
LC_ALL=C tr -cs '\n' '[x*]' | awk 'END {print NR}'
해당 tr
명령은 개행 문자(디코딩 문제를 피하기 위해 각 바이트는 C 로케일의 문자로 해석됨)를 제외한 하나 이상의 문자로 구성된 모든 시퀀스를 다음으로 변환합니다.하나 x
문자이므로 awk
입력 레코드의 길이는 0 또는 1바이트가 되고 입력에는 x
개행 문자만 포함됩니다.
$ printf '%10000s\na\0b\nc\nd' | wc -l
3
$ printf '%10000s\na\0b\nc\nd' | mawk 'END{print NR}'
2
$ printf '%10000s\na\0b\nc\nd' | busybox awk 'END{print NR}'
5
$ printf '%10000s\na\0b\nc\nd' | gawk 'END{print NR}'
4
$ printf '%10000s\na\0b\nc\nd' | LC_ALL=C tr -cs '\n' '[x*]' | mawk 'END{print NR}'
4
답변2
이를 사용할 수 있으며 파일 시작 부분부터 현재 레코드 수를 추적하는 awk
특수 변수가 있습니다 . NR
이 변수는 각 줄의 끝에서 증가됩니다. 블록에 인쇄할 때 END
, 즉 모든 입력 라인을 처리한 후 마지막으로 처리된 레코드의 번호를 인쇄합니다.
printf "aa\nbb" | awk 'END { print NR }'
2
printf "aa\nbb\n" | awk 'END { print NR }'
2