我需要将一个命令的输出通过管道传递给另外两个命令。
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