【问题标题】:bash obtain wc -l number and display in one command?bash 获取 wc -l 编号并在一个命令中显示?
【发布时间】:2011-04-06 08:30:50
【问题描述】:

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

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

这让我得到了我想要的数字,但在屏幕上没有显示任何内容(尽管我无论如何都会删除错误行)。

有没有办法做到这一点(将 wc -l 计数转换为 count 变量),同时在一个命令中将输出显示到控制台?我很确定在这里可以使用 tee 之类的东西,但我的大脑并没有按应有的方式工作。

否则,我想使用teecat 写入临时文件和控制台将它返回wc 会起作用,但我非常相信必须有一种更优雅的方式来做到这一点。

编辑: 抱歉,问题似乎不清楚。我不想在屏幕上显示计数,我想显示我已经得到的输出一直在计数,即:find的输出

【问题讨论】:

  • tee /dev/tty 应该回答您更新的问题。

标签: bash count lines tee wc


【解决方案1】:

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

试试这个:

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

【讨论】:

  • Sirex 想要查看的是 find 的输出,而不是计数。
  • @David Conrad:就是这样做的。
  • 对不起,你一定在我评论它的时候就在编辑它。我的评论适用于早期版本。
【解决方案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) 作为旁道,那么您可以打开原始 stdout 的副本并参考它:

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

0.02 美元

【讨论】:

  • 我喜欢这个。我试图记住如何打开现有文件句柄的副本,但不记得了。
【解决方案3】:

这是您已澄清问题的答案。这会将计数放入变量 $count 并显示 find 的输出:

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

【讨论】:

  • @Sirex:来得容易,去得也快;)
【解决方案4】:

更新问题更新后我have added another answer

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

输出

16
16

【讨论】:

  • @Paul:真的......好吧,我认为问题是关于在显示变量时设置变量;但我更新了显而易见的答案:)
  • 为什么它甚至没有回答问题时有两个赞成票? Sirex 希望它输出查找的结果,而不是计数。
【解决方案5】:

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

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

【讨论】:

  • 我正在丢弃权限被拒绝的错误,这些错误有时会在这不是以 root 身份运行时发生,至少我认为我是 :)
  • 啊。然后,我的最终会出现仍然显示的权限被拒绝错误。哦,好吧。
【解决方案6】:

如果您将 find 命令的标准输出 tee 到 stderr(此处通过匿名 fifo),则可以将 find 的输出打印到屏幕。

如果您的文件名或路径嵌入了换行符,您的计数就会出错。因此,使用 find 的 -print0 功能,然后用 tr 命令删除所有 not '\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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    相关资源
    最近更新 更多