1

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

cat anyfile.txt | grep anypattern

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

4

6 回答 6

1

用于tee重定向到wc

printf "    line %d\n" {1..4} | tee >(wc -l)
    line 1
    line 2
    line 3
    line 4
4
于 2013-07-29T12:20:08.177 回答
1

单程:

awk '/anypattern/{x++;print};END{print x}' anyfile.txt
于 2013-07-29T11:05:30.530 回答
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)
于 2013-07-29T11:18:05.340 回答
1
grep anypattern anyfile | tee /dev/stderr | wc -l

这将输出grepteewhich 的输出,然后将其写入标准输出stdout和标准错误stderr,最后将显示标准错误,而标准输出将通过管道传输到wc将显示行数。


例子 :

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

haystack
smokestack
stack
stacked
stacking
stack's
stacks
7
于 2013-07-29T11:04:22.410 回答
0

TL;博士

cat命令连接文件,因此除非您在单个文件(即UUOC )上调用 cat ,否则在读取第一个文件后,您的行号无论如何都没有任何用处。--number您可以通过使用带有 GNU cat 的标志来亲眼看到这一点。

使用来自 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

于 2013-07-29T11:20:58.510 回答
0
grep anypattern anyfile.txt 1>&2 | wc -l

该表达式1>&2指示bash复制stdout(fd=1) 的方式,即从上一个命令写入的所有内容也stdout都转到stderr(fd=2)。

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

于 2013-07-29T11:13:32.217 回答