bash获取wc -l号并在一个命令中显示?

时间:2011-04-06 08:30:51

标签: bash count lines tee wc

我很确定这是显而易见的,但目前我正在这样做:

count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | wc -l`

这给了我想要的数字,但是屏幕上没有显示任何内容(尽管我无论如何都会丢失错误行)。

有没有办法做到这一点(获取wc -l count到count变量),同时还在一个命令中显示输出到控制台?我很确定这里可以使用像tee这样的东西,但是我的大脑并没有像它那样工作。

否则,我想使用tee写入临时文件和控制台并将cat写回wc会有效,但我相信必须有更优雅的方式这样做。

编辑 抱歉,这个问题似乎不清楚。我不想显示计数到屏幕,我想显示我的输出一直在计数,即:来自find的输出

6 个答案:

答案 0 :(得分:5)

啊,所以你想要打印正常输出,并且$count中有匹配数?

试试这个:

count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee /dev/tty | wc -l`

答案 1 :(得分:2)

好的,然后回答更新的问题

tty方法很好,但会在非终端上失败(例如ssh localhost'echo hello> / dev / tty'失败)

可能只是

count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee >(cat >&2) | wc -l`

相当于

count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee /proc/self/fd/2 | wc -l`

如果您不想/不能在此处使用stderror(fd 2)作为sidechannel,那么您可以打开原始标准输出的副本并改为引用它:

exec 3>&1
count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee /proc/self/fd/3 | wc -l`

$ 0.02

答案 2 :(得分:1)

问题更新后

更新have added another answer

unset x
echo ${x:="$(find $dir -type f \( -perm -007 \) -print 2>/dev/null | wc -l)"}
echo $x

输出

16
16

答案 3 :(得分:1)

以下是您澄清问题的答案。这将计数置于变量$ count中并显示find的输出:

found=$(find $dir type f \( -perm -007 \) -print 2>/dev/null)
count=$(echo -e "$found" | wc -l)
echo -e "$found"

答案 4 :(得分:0)

我不确定我是否完全理解,因为所写的find命令不需要括号而且不应该产生任何错误,我不知道你是否需要将输出转到stdout或者如果你只是想看到它工作,在这种情况下,stderr也可以正常工作。我会这样做:

count=`find $dir -type f -perm -007 -print -fprint /dev/stderr | wc -l`

答案 5 :(得分:0)

如果tee将命令的stdout发送到stderr(此处通过匿名fifo),则可以打印find to screen的输出。

如果您的文件名或路径嵌入了换行符,那么您的计数就会出错。因此,使用find的-print0功能,然后使用tr命令删除'\ 0'的所有字节,最后只需使用wc命令计算'\ 0'字节端。

# show output of find to screen
count=`find . -type f \( -perm -007 \) -print0 2>/dev/null | tee >(tr '\0' '\n' > /dev/stderr) | tr -dc '\0' |  wc -c`
echo "$count"

# show output of count to screen
count=`find . -type f \( -perm -007 \) -print0 2>/dev/null | tee >(tr -dc '\0' | wc -c > /dev/stderr) | tr -dc '\0' |  wc -c`
echo "$count"