【问题标题】:How to know the number of displayed lines of the "cat" command?如何知道“cat”命令的显示行数?
【发布时间】:2013-07-29 10:59:42
【问题描述】:

如何知道下面“cat”命令的显示行数?

cat anyfile.txt | grep anypattern

使用| wc -l 将避免显示命令输出。我想保持输出显示

【问题讨论】:

  • 不要使用cat anyfile.txt | grep anypattern,只使用grep anypattern anyfile.txt
  • “知道”是什么意思?您是想将数字存储在变量中,还是希望它显示出来 - 如果是这样,它应该如何显示以与命令的输出不同?

标签: linux bash shell sh


【解决方案1】:

这是一种在仍然使用 grep 的情况下执行此操作的方法:

grep "anypattern" anyfile.txt | awk 'END{print NR}1'

编辑:在 shell 变量中保存行数:

方法一:

count=$(grep "anypattern" anyfile.txt | awk 'END{print NR > "/dev/stderr"}1' 3>&1 1>&2 2>&3)

方法二:

grep "anypattern" anyfile.txt | awk 'END{print NR > "/tmp/_temp"}1'
count=$(</tmp/_temp)

【讨论】:

  • 如何将行数保存到变量中,并且不与grep "anypattern" anyfile.txt的输出一起显示?
  • 我们绝对可以将变量保存在 awk 本身中。你想在 shell 中保存变量的同时显示搜索结果吗?
  • 是的,我想继续显示命令输出。并将行数保存到变量中并且不显示它
  • 好的,我会在几分钟后在我的电脑前编辑我的答案。
  • 不客气,我添加了 2 种方法将计数保存在 shell 变量中:第一种是不创建文件的 1 步过程,第 2 种是创建临时文件的 2 步过程。
【解决方案2】:

一种方式:

awk '/anypattern/{x++;print};END{print x}' anyfile.txt

【讨论】:

  • +1,我也会这样。但请注意,如果 grep 使用 -P,“anypattern”可能不适用于 awk
【解决方案3】:

使用tee 重定向到wc

printf "    line %d\n" {1..4} | tee >(wc -l)
    line 1
    line 2
    line 3
    line 4
4

【讨论】:

    【解决方案4】:
    grep anypattern anyfile | tee /dev/stderr | wc -l
    

    这会将grep 的输出通过管道传输到tee,然后将其同时写入标准输出stdout 和标准错误stderr,最后会显示标准错误,而标准输出将通过管道传输到@ 987654323@会显示行数。


    例子:

    grep stack /usr/share/dict/cracklib-small | tee /dev/stderr | wc -l
    
    haystack
    smokestack
    stack
    stacked
    stacking
    stack's
    stacks
    7
    

    【讨论】:

    • 如何将行数保存到变量中,不随cat命令的输出显示?
    【解决方案5】:
    grep anypattern anyfile.txt 1>&2 | wc -l
    

    表达式1&gt;&amp;2 指示bash 复制stdout (fd=1),这样从上一个命令写入stdout 的所有内容也将转到stderr (fd=2) .

    由于重定向运算符| 将源自stdout 的所有内容写入以下命令的stdin,您会在终端上看到stderr 的输出。

    【讨论】:

      【解决方案6】:

      TL;DR

      cat 命令连接文件,因此除非您在单个文件(即UUOC)上调用 cat,否则在第一个文件具有被阅读。通过使用带有 GNU cat 的 --number 标志,您可以亲眼看到这一点。

      使用 GNU Coreutils 中的 cat

      如果您使用的是 GNU cat,那么您可以使用 --number 标志。例如:

      $ cat --number <(echo one) <(echo two)
           1  one
           2  two
      

      这将显示输出及其在输出流中的当前行号。请注意,这完全是顺序的:在本例中,即使“two”是第二个文件的第一行,它也是连接输出的第二行。

      直接使用 Grep 标志

      如果您使用 GNU grep,您可以很容易地获取文件集合的文件名和行号。例如:

      $ grep --line-number --with-filename root /etc/passwd /etc/group
      /etc/passwd:1:root:x:0:0:root,,,:/root:/bin/bash
      /etc/group:1:root:x:0:
      

      GNU grep 将处理单个文件、多个文件和文件 glob,因此根本不需要 cat

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-03
        • 2022-01-11
        • 2011-11-14
        相关资源
        最近更新 更多