将一个命令的输出通过管道传输到另外两个命令

将一个命令的输出通过管道传输到另外两个命令

我需要将一个命令的输出通过管道传递给另外两个命令。

cat filename.txt | tail -n 1
cat filename.txt | wc -l

由于文件很大,我想避免读取两次。我检查了tee命令,但它将输出重定向到我不想要的文件。相关帖子很多,但没找到相关内容

答案1

如果我理解正确的话,您想要获取文件的最后一行以及行数:

$ cat a
aaa
bb
ccc
$
$ awk 'END{print $0; print NR}' a
ccc
3

因为您需要它们保存在变量中:

$ out=$(awk 'END{print $0"|"NR}' a)
$ last_line=$(echo $out | awk -F"|" '{print $1}' )
$ tot_cnt=$(echo $out | awk -F"|" '{print $2}' )
$ echo $last_line
ccc
$ echo $tot_cnt
3

答案2

{   
    {   tee /dev/fd/3 | wc -l >&4
    }   3>&1 | tail -n1
}   <filename.txt 4>&1

它不会避免读取两次 - 但在多核系统上它可能是并发的。然而,输出顺序并没有任何保证。

不过,模拟您所要求的最快方法可能是:

dd bs=64k <filename.txt | tail -n1

dd将向 stderr 报告其读/写并且仍然将所有文件复制到标准输出。

答案3

睡吧cat,你不需要它。

使用 :

tail -n 1 filename.txt
wc -l filename.txt

相关内容