如何知道以下“cat”命令的显示行数?
cat anyfile.txt | grep anypattern
使用| wc -l
将避免显示命令输出。我想保持输出显示
答案 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)
cat 命令连接文件,因此,除非您在单个文件(UUOC)上调用cat,否则您的行号在第一个文件后无论如何都不会有用文件已被阅读。您可以通过使用GNU cat的--number
标志来直接看到这一点。
如果你正在使用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将处理单个文件,多个文件和文件全局,因此 cat 根本不需要。