如何计算文档中的行数?


1075

我有这样的台词,我想知道我实际上有几行...

09:16:39 AM  all    2.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   94.00
09:16:40 AM  all    5.00    0.00    0.00    4.00    0.00    0.00    0.00    0.00   91.00
09:16:41 AM  all    0.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:42 AM  all    3.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:43 AM  all    0.00    0.00    1.00    0.00    1.00    0.00    0.00    0.00   98.00
09:16:44 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
09:16:45 AM  all    2.00    0.00    6.00    0.00    0.00    0.00    0.00    0.00   92.00

有没有一种方法可以使用linux命令对它们进行计数?


4
使用vim打开文件,然后键入g <Ctrl-g>,它将向您显示行数,单词数,列数和字节数
Luv33preet

30
@ Luv33preet,然后您会回到原来的位置,查找如何退出vim
Skylar

5
@SkylarIttner如果您需要查找如何退出vim,这<esc> :q!是唯一的答案。(这是一个笑话,它将删除所有未保存的更改—笑话是,如果您不知道vim,很容易弄乱文件,因此最好不要保存它)。
瑞安

Answers:


2028

用途wc

wc -l <filename>

这将输出行数<filename>

$ wc -l /dir/file.txt
3272485 /dir/file.txt

或者,<filename>要从结果中省略,请使用wc -l < <filename>

$ wc -l < /dir/file.txt
3272485

您还可以通过管道将数据发送到wc

$ cat /dir/file.txt | wc -l
3272485
$ curl yahoo.com --silent | wc -l
63

18
这很棒!!您可以使用awk删除行号后面的文件名,例如:wc -l <file> | awk '{print $1}
CheeHow 2014年

80
甚至更短,您可以这样做wc -l < <filename>
Tensigh 2014年

5
@ GGB667,您也可以使用cat <file> | wc -l
baptx

14
并且watch wc -l <filename>您可以实时跟踪此文件。例如,这对于日志文件很有用。
DarkSide 2015年

27
请注意wc -l会计算“换行符”。如果您的文件中包含两行文本和一个“换行”符号,则wc将输出“ 1”而不是“ 2”。
康斯坦丁

140

要计算所有行,请使用:

$ wc -l file

要仅过滤和计数具有模式的行,请使用:

$ grep -w "pattern" -c file  

或使用-v反转匹配:

$ grep -w "pattern" -c -v file 

请参阅grep手册页以了解-e,-i和-x参数...


有时候,这些grep -c作品对我来说更好。主要是由于wc -l烦人的“功能”填充空间前缀。
MarkHu


43

有很多方法。使用wc是一个。

wc -l file

其他包括

awk 'END{print NR}' file

sed -n '$=' file (GNU sed)

grep -c ".*" file

3
是的,但是wc -l file为您提供行数和文件名以获得您可以执行的文件名:filename.wc -l < /filepath/filename.ext
ggb667 2013年

使用GNU grep -H参数返回文件名和计数。 grep -Hc ".*" file
Zlemini

我投票赞成这种解决方案,因为它wc -l计算换行符,而不是文件中的实际行数。如果您需要这些行,此答案中包含的所有其他命令将为您提供正确的编号。
growlingchaos

27

该工具wc在UNIX和类似UNIX的操作系统中是“字计数器”,但是您也可以通过添加-l选项来使用它来对文件中的行进行计数。

wc -l foo将计算中的行数foo。您还可以通过管道输送这样的程序的输出:ls -l | wc -l,它将告诉您当前目录中有多少个文件(加一个)。


3
ls -l | wc -l 实际上会为您提供目录+1中总大小行的文件数。您可以ls -ld * | wc -l获取正确数量的文件。
约书亚·劳伦斯·奥斯蒂尔

24

如果要检查目录中所有文件的总行,可以使用find和wc:

find . -type f -exec wc -l {} +


15

如果您只需要行数(而不是行数和返回的愚蠢文件名):

wc -l < /filepath/filename.ext

如前所述,它们也可以工作(但由于其他原因,它们也较次要):

awk 'END{print NR}' file       # not on all unixes
sed -n '$=' file               # (GNU sed) also not on all unixes
grep -c ".*" file              # overkill and probably also slower

3
在提出问题3年后发布了这个答案,它只是在复制其他问题。第一部分是琐碎的,第二部分是所有ghostdog答案的补充。投票失败。
fedorqui'SO停止伤害

4年..令人沮丧。让我们看看是否可以得到十年的连续投票!
Damien Roche

1
不,你错了; ghostdog的答案未回答原始问题。它为您提供行数和文件名。要仅获取文件名,您可以执行以下操作:filename.wc -l <​​/filepath/filename.ext。这就是为什么我发布了答案。awk,sed和grep都是这样做的劣等方法。正确的方法是我列出的方法。
ggb667 '16

8

nl像这样使用:

nl filename

来自man nl

将每个FILE写入行添加到标准输出。没有FILE或FILE为-时,读取标准输入。


这是我发现的第一个答案,该答案适用于单行文本而不以换行符结尾的文件,该文件wc -l报告为0。谢谢。
Scott Joudry

7

我一直在用这个:

cat myfile.txt | wc -l

我更喜欢它而不是可接受的答案,因为它不会打印文件名,并且您不必使用它awk来解决该问题。接受的答案:

wc -l myfile.txt

但是我认为最好的是GGB667的答案:

wc -l < myfile.txt

从现在开始,我可能会使用它。比我的方式略短。如果有人喜欢,我会保留我的旧方法。这两种方法的输出相同。


3
第一个和最后一个方法是相同的。最后一个更好,因为它不会产生额外的进程

5

上面是首选方法,但是“ cat”命令也有帮助:

cat -n <filename>

将用行号显示文件的全部内容。


5

我在寻找一种计算多个文件行的方式时遇到了这个问题,因此,如果您要计算一个.txt文件的多个文件行,可以执行此操作,

cat *.txt | wc -l

它还将在一个.txt文件上运行;)


5

wc -l 不计算行数。

是的,这个答案对聚会来说可能有点晚了,但是我还没有找到任何人在答案中提供更强大的解决方案。

与流行的看法相反,POSIX完全不需要文件以换行符结尾。是的,POSIX 3.206线路的定义如下:

零个或多个非<newline>字符加上一个终止字符的序列。

但是,许多人不知道的是POSIX还将POSIX 3.195不完整行定义为:

文件末尾的一个或多个非<newline>字符序列。

因此,没有尾随的文件LF完全符合POSIX。

如果您选择不同时支持两种EOF类型,则您的程序不兼容POSIX。

例如,让我们看一下以下文件。

1 This is the first line.
2 This is the second line.

无论EOF,我相信您都会同意有两行。您通过查看已开始的行数而不是已终止的行数来弄清楚。换句话说,按照POSIX,这两个文件的行数相同:

1 This is the first line.\n
2 This is the second line.\n
1 This is the first line.\n
2 This is the second line.

手册页对于wc计数换行符相对比较清楚,换行符只是一个0x0a字符:

NAME
       wc - print newline, word, and byte counts for each file

因此,wc甚至不要尝试计算您可能会称呼的“线”。使用wc计算行可以很好地导致误算,这取决于你的输入文件的EOF。

符合POSIX的解决方案

您可以像上面的示例一样grep进行计数。此解决方案既更健壮又更精确,并且支持文件中行的所有不同形式:

$ grep -c ^ FILE

4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+'返回数字。


3

重定向/管道文件的输出wc -l应足以,如下所示:

cat /etc/fstab | wc -l

然后将提供否。只行。


3

或计数具有文件名模式的子目录中的所有行(例如,文件名中带有时间戳的日志文件):

wc -l ./**/*_SuccessLog.csv

2

我知道这很旧,但仍然:计算已过滤的行

我的档案看起来像:

Number of files sent
Company 1 file: foo.pdf OK
Company 1 file: foo.csv OK
Company 1 file: foo.msg OK
Company 2 file: foo.pdf OK
Company 2 file: foo.csv OK
Company 2 file: foo.msg Error
Company 3 file: foo.pdf OK
Company 3 file: foo.csv OK
Company 3 file: foo.msg Error
Company 4 file: foo.pdf OK
Company 4 file: foo.csv OK
Company 4 file: foo.msg Error

如果我想知道发送了多少文件,请执行以下操作:

grep "OK" <filename> | wc -l

要么

grep -c "OK" filename

2

计算行数并将结果存储在变量中,请使用以下命令:

count=$(wc -l < file.txt) echo "Number of lines: $count"


1

正如其他人所言,这wc -l是最好的解决方案,但是您可以使用Perl作为参考,以供将来参考:

perl -lne 'END { print $. }'

$.包含行号,并且END块将在脚本末尾执行。


1
不起作用:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW

1
@VeikkoW为我工作。如果您使用Windows,则适用不同的报价规则。但是OP询问了有关Linux / Bash的信息。
2015年

1
perl -lne '}{ print $. '一样。
Tom Fenech 2015年


1

wc -l <filename>

这将为您提供输出中的行数和文件名。

例如。

wc -l 24-11-2019-04-33-01-url_creator.log

输出量

63 24-11-2019-04-33-01-url_creator.log

采用

wc -l <filename>|cut -d\ -f 1

仅获得输出中的行数。

例如。

wc -l 24-11-2019-04-33-01-url_creator.log|cut -d\ -f 1

输出量

63


重复接受(十岁)的答案有何好处?
jeb

因为我找不到在该线程的输出中仅获取行号的命令。
严厉的萨罗

这是公认的答案中的第二个例子。wc -l < filename
jeb

wc -l <​​filename>给出文件名以及输出中的行数。
严厉的Sarohi

不,wc -l < filename不同于wc -l filename,首先使用重定向,然后输出中没有任何文件名,如user85509的答案
jeb

1

这种嵌入式便携式外壳功能[ℹ]   就像一个吊饰。只需将以下代码段添加到您的.bashrc文件(或与您的shell环境等效的代码)中即可

# ---------------------------------------------
#  Count lines in a file
#
#  @1 = path to file
#
#  EXAMPLE USAGE: `count_file_lines $HISTFILE`
# ---------------------------------------------
count_file_lines() {
    local subj=$(wc -l $1)
    subj="${subj//$1/}"
    echo ${subj//[[:space:]]}
}

除了bashzsh之外,它应该与所有POSIX兼容的shell完全兼容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.