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}'

反而。

相关内容