nl:如何在第二行开始行号?

Wol*_*olf 7 ls 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:~$
Run Code Online (Sandbox Code Playgroud)

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:~$
Run Code Online (Sandbox Code Playgroud)

JoL*_*JoL 15

用其他东西消耗第一行并将其余部分传递给 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果您想进一步向下开始行编号,请告诉sed何时quit:

$ 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
Run Code Online (Sandbox Code Playgroud)

你也可以使用类似的东西/\.\.$/q而不是3q.

  • @Ángel 不过,您丢失了第一行,我认为保留它而不将其包含在行号中是这个问题的重点。 (5认同)
  • `ls -lh | 尾 -n +2 | nl` 可能会更干净。 (4认同)

ann*_*hri 13

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
Run Code Online (Sandbox Code Playgroud)


ste*_*ver 7

这有点难看,但至少使用 GNU Coreutils 实现,nl您可以通过正则表达式指定要编号的行 - 因为t它不是ls长列表输出1 中可能的文件类型之一,您可以这样做

ls -lh | nl -bp'^[^t]'
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并不能保持输出对齐。

也许最正式的正确方法是将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
Run Code Online (Sandbox Code Playgroud)

(默认情况下,标题编号样式为none)。

  • 如果指定了足够的数字宽度,则可以保留对齐方式,例如,`ls -lh | nl -w4 -bp'^[^t]'`。 (2认同)

Adm*_*Bee 6

你可以试试awk

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

这将打印“总计”行而不对其进行编号,以及所有剩余的带有数字的行,右调整,字段宽度为 5。数字和行内容之间的空格将是两个空格(格式字符串5s中的后面的文本printf()); 您可以将其替换为其他内容,例如\t.

如果您不需要“总计”行,则可以使用

ls -lh | awk 'NR>1{print (NR-1) "\t" $0}'
Run Code Online (Sandbox Code Playgroud)

或者

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

反而。