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停用緩衝),將消耗一行和quit,在終止前隱式列印該行。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它不是ls長列表輸出中可能的檔案類型之一1你可以做

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 5s。後面的文字)printf());您可以將其替換為其他內容,例如\t.

如果您不需要“總計”行,您可以使用

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

或者

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

反而。

相關內容