nl: 두 번째 줄에서 줄 번호를 시작하는 방법은 무엇입니까?

nl: 두 번째 줄에서 줄 번호를 시작하는 방법은 무엇입니까?

이것은 표준 출력입니다.ls -ln | nl

wolf@linux:~$ ls -lh | nl
     1  total 24
     2  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     3  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     4  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py
wolf@linux:~$

에서 번호를 시작하는 대신 total 24두 번째 줄인 실제 파일/디렉토리에서 시작할 수 있습니까?

원하는 출력

wolf@linux:~$ ls -lh | nl
        total 24
     1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py
wolf@linux:~$

답변1

첫 번째 줄을 다른 것으로 소비하고 나머지는 다음 줄에 전달합니다.nl

$ ls -lh | { sed -u q; nl; }
total 24
     1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py

sed( -u버퍼링을 비활성화하기 위해) 한 줄씩 소비하여 q종료 전에 암시적으로 줄을 인쇄합니다. nl나머지 라인을 소비합니다.

첫 번째 줄을 들여쓰려면 다음과 같이 하면 됩니다.

$ ls -lh | { sed -u 's/^/        /;q'; nl; }
        total 24
     1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py

줄 번호 매기기를 더 아래로 시작하려면 sed언제 q사용해야 하는지 알려주세요.

$ ls -alh | { sed -u 's/^/        /;3q'; nl; }
        total 24
        drwx------ 1 wolf wolf  186 Sep  24 22:18 .
        drwx------ 1 wolf wolf  186 Sep  24 22:18 ..
     1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py

/\.\.$/q대신에 같은 것을 사용할 수도 있습니다 3q.

답변2

nl그러면 0부터 시작 됩니다 .

$ ls -lh | nl -v 0
   0  total 24
   1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
   2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
   3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py

답변3

다소 추악하지만 적어도 GNU Coreutils 구현을 사용하면 nl정규식을 통해 번호를 매길 줄을 지정할 수 있습니다. 왜냐하면 은 긴 목록 출력 t에서 ​​가능한 파일 형식 중 하나가 아니기 때문입니다.ls1당신은 할 수

ls -lh | nl -bp'^[^t]'

불행히도 이것은 출력 정렬을 유지하지 않습니다.

아마도 가장 형식적으로 올바른 접근 방식은 ls출력을 별개의 헤더와 본문 섹션으로 분리하는 것입니다.

$ ls -lh | sed -e '1s/.*/\\:\\:\\:\n&\n\\:\\:/' | nl

       total 0

     1  -rw-rw-rw- 1 steeldriver steeldriver   0 Sep  9 19:53 bar
     2  -rw-r--r-- 1 steeldriver steeldriver 449 Sep 16 17:41 bash_envs
     3  -rw-rw-rw- 1 steeldriver steeldriver 131 Sep  5 18:13 dirlist
     4  -rw-r--r-- 1 steeldriver steeldriver 359 Sep 13 19:42 error_status

(기본적으로 헤더 번호 매기기 스타일은 다음과 같습니다.없음).

답변4

대신 다음을 사용해 볼 수 있습니다 awk.

ls -lh | awk '{printf("%5s  ",NR==1?" ":NR-1); print}'

그러면 번호를 매기지 않고 "합계" 줄이 인쇄되고 숫자가 포함된 나머지 모든 줄은 오른쪽으로 조정되고 필드 너비는 5가 됩니다. 숫자와 줄 내용 사이의 공백은 2개의 공백이 됩니다( 형식 문자열 5s에서 뒤에 오는 텍스트). printf()); 와 같은 다른 것으로 바꿀 수 있습니다 \t.

"총계" 행이 필요하지 않은 경우 다음을 사용할 수 있습니다.

ls -lh | awk 'NR>1{print (NR-1) "\t" $0}'

또는

ls -lh | awk 'NR>1 {printf("%5s  ",NR-1); print}'

대신에.

관련 정보