如何计算文档中的行?

时间:2010-06-29 00:31:31

标签: linux bash command-line scripting

我有这样的行,我想知道实际上有多少行......

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命令统计它们?

27 个答案:

答案 0 :(得分:1709)

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

答案 1 :(得分:130)

要计算所有行数:

$ wc -l file

仅过滤和计算使用模式的行:

$ grep -w "pattern" -c file  

或使用-v反转匹配:

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

请参阅grep手册页以查看-e,-i和-x args ......

答案 2 :(得分:67)

wc -l <file.txt>

或者

command | wc -l

答案 3 :(得分:42)

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

wc -l file

其他包括

awk 'END{print NR}' file

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

grep -c ".*" file

答案 4 :(得分:25)

工具wc是UNIX和类UNIX操作系统中的“字计数器”,您还可以通过添加-l选项使用它来计算文件中的行,因此{{ 1}}将计算wc -l foo中的行数。您还可以通过以下程序管道输出:foo,它将告诉您当前目录中有多少文件。

答案 5 :(得分:22)

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

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

答案 6 :(得分:21)

使用wc

wc -l <filename>

答案 7 :(得分:13)

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

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

答案 8 :(得分:7)

我一直在用这个:

cat myfile.txt | wc -l

我比接受的答案更喜欢它,因为它不打印文件名,你不必使用awk来修复它。接受的答案:

wc -l myfile.txt

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

wc -l < myfile.txt

我可能会从现在开始使用它。它比我的方式略短。如果有人喜欢的话,我会用我原来的方式做这件事。这两种方法的输出相同。

答案 9 :(得分:6)

像这样使用nl

nl filename

来自man nl

  

将每个FILE写入标准输出,并添加行号。同   没有FILE,或者当FILE是 - 时,读取标准输入。

答案 10 :(得分:5)

wc -l不计算行数。

是的,这个答案可能晚了一些,但是我还没有找到任何人在答案中提供更可靠的解决方案。

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

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

但是,很多人不知道的是POSIX也将POSIX 3.195 Incomplete Line定义为:

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

因此,没有结尾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甚至没有尝试计算您可能称为“行”的数量。根据输入文件的EOF,使用wc对行进行计数很可能导致错误计数。

符合POSIX的解决方案

您可以使用grep来计数,就像上面的示例一样。此解决方案既更健壮又更精确,并且支持文件中的行可能具有的所有不同风味:

$ grep -c ^ FILE

答案 11 :(得分:5)

以上是首选方法但是&#34; cat&#34;命令也有帮助:

cat -n <filename>

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

答案 12 :(得分:5)

我在寻找计算多个文件行的方法时看到了这个问题, 因此,如果你想计算.txt文件的多个文件行,你可以这样做,

cat *.txt | wc -l

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

答案 13 :(得分:4)

wc -l file.txt | cut -f3 -d" "

仅返回行数

答案 14 :(得分:4)

cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+':为了返回数字

答案 15 :(得分:3)

将文件输出重定向/管道传输到wc -l就足够了,如下所示:

cat /etc/fstab | wc -l

然后将提供否。仅限行。

答案 16 :(得分: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

如果我想知道发送了多少文件OK:

grep "OK" <filename> | wc -l

OR

grep -c "OK" filename

答案 17 :(得分:2)

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

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

答案 18 :(得分:1)

我刚刚制作了一个程序(node

npm install gimme-lines
gimme-lines verbose --exclude=node_modules,public,vendor --exclude_extensions=html

https://github.com/danschumann/gimme-lines/tree/master

答案 19 :(得分:1)

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

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

答案 20 :(得分: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

答案 21 :(得分:1)

此嵌入式便携式shell函数[ℹ]就像一个魅力。只需将以下代码段添加到您的 .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:]]}
}

除了POSIX-compliant shellsbash之外,这还应该与所有zsh完全兼容。

答案 22 :(得分:0)

正如其他人所说,wc -l是最佳解决方案,但为了将来参考,您可以使用Perl:

perl -lne 'END { print $. }'

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

答案 23 :(得分:0)

wc -l文件名

例如:wc -l file.txt

它将为您提供该文件中的总行数

要获取最后一行,请使用 tail -1 file_name

答案 24 :(得分:0)

我试过 wc -l 从文件名中获取行数

要进行更多过滤,例如要计算文件中注释行的数量,请使用 grep '#' Filename.txt | wc -l

echo  "No of files in the file $FILENAME"
wc -l < $FILENAME
echo total number of commented lines
echo $FILENAME
grep '#' $FILENAME | wc -l

答案 25 :(得分:0)

Awk 可以挽救生命(还有线路):

awk '{c++};END{print c}' < file

如果您想确保不计算空行,您可以这样做:

awk '/^./' '{c++};END{print c}' < file

答案 26 :(得分:0)

如果您使用的是某种基于 BSD 的系统,例如 macOS,我建议您使用 gnu 版本的 wc。它不会像 BSD wc 那样在某些二进制文件上绊倒。至少它仍然有些可用的性能。另一方面,BSD 的尾部很慢………………zzzzzzzzzz…………

至于 AWK,虽然只是一个小小的警告 - 因为它在默认的行假设下运行,意思是 \n,如果你的文件碰巧没有尾随的换行符,AWK 会多计它1 与 BSD 或 GNU wc 相比。此外,如果您输入的内容根本没有新行,例如 echo -n,取决于您是在 END { } 部分还是在 FNR==1 处进行测量,NR 将为不一样。