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

时间:2013-07-29 10:59:42

标签: linux bash shell sh

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

cat anyfile.txt | grep anypattern

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

6 个答案:

答案 0 :(得分:1)

grep anypattern anyfile | tee /dev/stderr | wc -l

这会将grep的输出传输到tee,然后将其写入标准输出stdout和标准错误stderr,最后会显示标准错误标准输出将被传送到wc,这将显示行数。


示例:

grep stack /usr/share/dict/cracklib-small | tee /dev/stderr | wc -l

haystack
smokestack
stack
stacked
stacking
stack's
stacks
7

答案 1 :(得分:1)

一种方式:

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

答案 2 :(得分:1)

这是在使用grep时执行此操作的一种方法:

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

编辑:要保存shell变量中的行数:

方法1:

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

方法2:

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

答案 3 :(得分:1)

使用tee重定向到wc

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

答案 4 :(得分:0)

grep anypattern anyfile.txt 1>&2 | wc -l

表达式1>&2指示bash复制stdout(fd = 1),使得从上一个命令写入stdout的所有内容都转到{{} 1}}(fd = 2)。

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

答案 5 :(得分:0)

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 Flags

如果您使用的是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将处理单个文件,多个文件和文件全局,因此 cat 根本不需要。