如何知道以下“cat”命令的显示行数?
cat anyfile.txt | grep anypattern
使用| wc -l
将避免显示命令输出。我想保持输出显示
用于tee
重定向到wc
:
printf " line %d\n" {1..4} | tee >(wc -l)
line 1
line 2
line 3
line 4
4
单程:
awk '/anypattern/{x++;print};END{print x}' anyfile.txt
这是在仍然使用 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)
cat命令连接文件,因此除非您在单个文件(即UUOC )上调用 cat ,否则在读取第一个文件后,您的行号无论如何都没有任何用处。--number
您可以通过使用带有 GNU cat 的标志来亲眼看到这一点。
如果您使用的是 GNU cat,那么您可以只使用该--number
标志。例如:
$ cat --number <(echo one) <(echo two)
1 one
2 two
这将显示输出及其在输出流中的当前行号。请注意,这完全是顺序的:在此示例中,即使“two”是第二个文件的第一行,它也是连接输出的第二行。
如果您使用 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。
grep anypattern anyfile.txt 1>&2 | wc -l
该表达式1>&2
指示bash
复制stdout
(fd=1) 的方式,即从上一个命令写入的所有内容也stdout
都转到stderr
(fd=2)。
由于重定向运算符|
将源自以下命令的所有内容写入您在终端上看到的stdout
输出。stdin
stderr