命令获取STDOUT的第n行

是否有任何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命令来做这件事,而不需要我把脚本放在合适的位置。

209599 次浏览
ls -l | head -2 | tail -1

Perl对您来说容易获得吗?

$ perl -n -e 'if ($. == 7) { print; exit(0); }'

显然,用任何你想用的数字来代替7。

可以选择正面/反面的方式:

ls -al | awk 'NR==2'

ls -al | sed -n '2p'

为了完整起见;-)

较短的代码

find / | awk NR==3

缩短人的寿命

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

试试这个sed版本:

ls -l | sed '2 ! d'

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

使用sed,只是为了多样化:

ls -l | sed -n 2p

使用这种替代方法看起来更有效,因为它在打印所需的行时停止读取输入,可能会在馈送过程中生成一个SIGPIPE,这可能会反过来生成一个不想要的错误消息:

ls -l | sed -n -e '2{p;q}'

我经常看到这样的情况,所以我通常使用第一个命令(无论如何,它更容易输入),尽管ls不是一个在得到SIGPIPE时抱怨的命令。

对于一系列的行:

ls -l | sed -n 2,4p

对于几个范围的行:

ls -l | sed -n -e 2,4p -e 20,30p
ls -l | sed -n -e '2,4p;20,30p'

为了更完整..

ls -l | (for ((x=0;x<2;x++)) ; do read ; done ; head -n1)

在你看到第二行之前,先把行扔掉,然后打印出第一行。它打印第三行。

如果只是第二行…

ls -l | (read; head -n1)

写必要的“阅读”。

你可以使用awk:

ls -l | awk 'NR==2'

更新

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

ls -l | awk 'NR==3'

是的,最有效的方法(正如Jonathan Leffler已经指出的那样)是使用sed和print &退出:

set -o pipefail                        # cf. help set
time -p ls -l | sed -n -e '2{p;q;}'    # only print the second line & quit (on Mac OS X)
echo "$?: ${PIPESTATUS[*]}"            # cf. man bash | less -p 'PIPESTATUS'

sed1line:

# print line number 52
sed -n '52p'                 # method 1
sed '52!d'                   # method 2
sed '52q;d'                  # method 3, efficient on large files

awk1line:

# print line number 52
awk 'NR==52'
awk 'NR==52 {print;exit}'          # more efficient on large files

sed在我的情况下没有工作。 我建议:< / p >

对于“奇数”行1,3,5,7…ls |awk '0 == (NR+1) % 2'

对于“偶数”行2,4,6,8 ls |awk '0 == (NR) % 2'

另一位网友建议

ls -l | head -2 | tail -1

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

管尾入头部

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

会更有效率吗?