是否有任何bash命令可以让您获得STDOUT的第n行?

也就是说,需要这个

$ ls -l
-rw-r--r--@ 1 root  wheel my.txt
-rw-r--r--@ 1 root  wheel files.txt
-rw-r--r--@ 1 root  wheel here.txt

做一些像这样的事情

$ ls -l | magic-command 2
-rw-r--r--@ 1 root  wheel files.txt

我意识到,当编写要重用的脚本时,这将是一个糟糕的实践,但是当每天使用shell时,能够以这种方式过滤我的STDOUT对我来说是有用的。

我也意识到这将是一个非常简单的命令(缓冲区STDOUT,返回一个特定的行),但是我想知道是否有一些标准的shell命令来执行此操作,而无需我放置脚本。


当前回答

另一位网友建议

ls -l | head -2 | tail -1

但如果你从头到尾进行管道处理,看起来直到第N行之前的所有内容都被处理了两次。

管尾入头部

ls -l | tail -n +2 | head -n1

会更有效率吗?

其他回答

Hmm

Sed对我没用。 我提议:

怪客队伍1,3,5,7,ls |啊‘1 + 0 = (NR) % 2” “即使线条2,4,6,8 ls |啊‘0 = = (NR) % = 2

你可以使用awk:

ls -l | awk 'NR==2'

更新

上面的代码不会得到我们想要的结果,因为存在off-by-one错误:ls -l命令的第一行是总行。为此,以下修订的代码将起作用:

ls -l | awk 'NR==3'

另一位网友建议

ls -l | head -2 | tail -1

但如果你从头到尾进行管道处理,看起来直到第N行之前的所有内容都被处理了两次。

管尾入头部

ls -l | tail -n +2 | head -n1

会更有效率吗?

试试这个sed版本:

ls -l | sed '2 ! d'

它说“删除除第二行以外的所有行”。

为了完整起见;-)

较短的代码

find / | awk NR==3

缩短人的寿命

find / | awk 'NR==3 {print $0; exit}'