【问题标题】:How to count lines in a document? [closed]如何计算文档中的行数? [关闭]
【发布时间】:2011-03-09 09:39:47
【问题描述】:

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

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

【问题讨论】:

  • 用vim打开文件,然后输入g <Ctrl-g>,会显示行数、字数、列数和字节数

标签: linux bash command-line scripting


【解决方案1】:

以防万一。与 find 命令结合使用许多文件都可以做到这一点。

find . -name '*.java' | xargs wc -l 

【讨论】:

  • 不要使用xargs。 find 命令有一个-exec 动词,使用起来要简单得多。 6 年前就有人建议使用它,尽管这个问题没有询问有关多个文件的任何内容。 stackoverflow.com/a/28016686
【解决方案2】:

Awk 节省了生命时间(也节省了行数):

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

如果你想确保你没有计算空行,你可以这样做:

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

【讨论】:

  • awk 这样使用比grep -c '^'慢16倍
  • @Eric grep 也算行数吗?
  • 当然:grep -c -E ^ 将计算“行首”标记的数量,从而计算行数。
  • @Eric 啊酷,酷。我打算建议您发布该答案,但看起来 someone 其他人已经这样做了。无论如何,当我发布这个答案时,我刚刚发现了awk,这是我发现它可以做的许多事情之一。我也刚刚测试了一个 1GB 的文件,awk 只慢了 4 倍,而不是 16 倍。我使用base64 /dev/urandom | head -c 1000000000 创建了测试文件,但是文件更小(这些答案很可能会用于),速度几乎不可变
  • 是的,这种文件的比率也为 4。因此,根据文件的不同,您的里程可能会有所不同。关键是它总是有利于grep。
【解决方案3】:

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

至于 AWK,虽然只是一个小警告 - 因为它在默认的行假设下运行,即 \n,如果您的文件恰好没有尾随的新行分隔符,AWK 会将其计数超过 1到 BSD 或 GNU wc。此外,如果您使用的是完全没有新行的东西,例如echo -n,取决于您是在END { } 部分还是FNR==1 进行测量,NR 会有所不同。

【讨论】:

    【解决方案4】:

    我尝试 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
    

    【讨论】:

      【解决方案5】:

      wc -l 文件名

      例如:wc -l file.txt

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • ls -l | wc -l 实际上会给您目录中的文件数 +1 总大小行。您可以通过ls -ld * | wc -l 获取正确数量的文件。
        【解决方案7】:

        这个嵌入式便携式外壳函数[ℹ] 就像一个魅力。只需将以下 sn-p 添加到您的 .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:]]}
        }
        

        这应该与除了bash 和zsh 之外的所有POSIX-compliant shells 完全兼容。

        【讨论】:

          【解决方案8】:

          wc -l &lt;filename&gt;

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

          例如。

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

          输出

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

          使用

          wc -l &lt;filename&gt;|cut -d\ -f 1

          只获取输出中的行数。

          例如。

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

          输出

          63

          【讨论】:

          • 重复已接受(十年前)的答案有什么好处?
          • 因为我在这个线程的输出中找不到仅获取行号的命令。
          • 这是已接受答案中的第二个示例。 wc -l &lt; filename
          • wc -l 给出文件名以及输出中的行数。
          • 不,wc -l &lt; filename 与wc -l filename 不同,首先使用重定向,然后输出中没有任何文件名,如the answer from user85509 所示
          【解决方案9】:

          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 甚至不会尝试计算您可能称之为“线”的内容。使用wc 计算行数很可能会导致错误计数,具体取决于输入文件的EOF。

          POSIX 兼容解决方案

          您可以使用grep 来计算行数,就像上面的示例一样。这个解决方案更加健壮和精确,它支持文件中行的所有不同风格:

          $ grep -c ^ FILE
          

          【讨论】:

          • 这应该是公认的答案。不仅因为它是正确的,还因为 grep 比 wc 快两倍以上。
          • 哇,这是一个很好的答案。它需要成为公认的答案,因为它有很好的解释并且清楚地概述了 POSIX 规范。
          • 非常好:您可能想评论this
          【解决方案10】:

          计算行数并将结果存储在变量中使用此命令:

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

          【讨论】:

            【解决方案11】:

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

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

            【讨论】:

              【解决方案12】:

              要计算所有行,请使用:

              $ wc -l file
              

              仅过滤和计算带有模式的行:

              $ grep -w "pattern" -c file  
              

              或者使用 -v 反转匹配:

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

              查看 grep 手册页以了解 -e、-i 和 -x 参数...

              【讨论】:

              • 奇怪的是,有时grep -c 更适合我。主要是因为wc -l 烦人的“功能”填充空间前缀。
              • 另外,当您的最后一行不以 LF 或 CRLF 结尾时,wc -l 会给出错误的行数,因为它只计算行结尾。所以grep 和^.*$ 这样的模式实际上会给你真正的行号。
              【解决方案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
              

              【讨论】:

              • 这个答案是在提出问题 3 年后发布的,它只是在复制其他答案。第一部分是微不足道的,第二部分是 ghostdog's answer 正在添加的所有内容。投反对票。
              • 4 年了.. 否决。让我们看看我们能否获得长达十年的连续投反对票!
              • 不,你错了; ghostdog 的回答没有回答原来的问题。它为您提供行数和文件名。要仅获取文件名,您可以执行以下操作:filename.wc -l
              【解决方案14】:
              cat file.log | wc -l | grep -oE '\d+'
              
              • grep -oE '\d+':为了返回数字号码ONLY。

              【讨论】:

                【解决方案15】:

                我知道这是旧,但仍然:计算过滤行数

                我的文件看起来像:

                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
                

                或

                grep -c "OK" filename
                

                【讨论】:

                  【解决方案16】:

                  我一直在用这个:

                  cat myfile.txt | wc -l
                  

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

                  wc -l myfile.txt

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

                  wc -l &lt; myfile.txt

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

                  【讨论】:

                  • 第一个和最后一个方法是一样的。最后一个更好,因为它不会产生额外的进程
                  【解决方案17】:

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

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

                  【讨论】:

                    【解决方案18】:

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

                    cat /etc/fstab | wc -l
                    

                    然后它将提供否。仅行。

                    【讨论】:

                      【解决方案19】:

                      像这样使用nl:

                      nl filename
                      

                      来自man nl:

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

                      【讨论】:

                      • 这是我发现的第一个答案,它适用于具有单行文本且不以换行符结尾的文件,wc -l 报告为 0。谢谢。
                      【解决方案20】:

                      使用wc:

                      wc -l <filename>
                      

                      这将输出&lt;filename&gt;中的行数:

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

                      或者,要从结果中省略&lt;filename&gt;,请使用wc -l &lt; &lt;filename&gt;:

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

                      您也可以将数据通过管道传输到wc:

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

                      【讨论】:

                      • 这太棒了!!您可以使用 awk 来删除附加到行号的文件名,如下所示:wc -l &lt;file&gt; | awk '{print $1}
                      • 更短的,你可以做wc -l &lt; &lt;filename&gt;
                      • @GGB667 你也可以用cat &lt;file&gt; | wc -l去掉文件名
                      • 和watch wc -l &lt;filename&gt;,您可以实时关注此文件。例如,这对日志文件很有用。
                      • 注意 wc -l 计算“换行符”。如果你有一个包含 2 行文本和一个“换行”符号的文件,wc 将输出“1”而不是“2”。
                      【解决方案21】:

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

                      cat *.txt | wc -l
                      

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

                      【讨论】:

                        【解决方案22】:

                        我刚刚编写了一个程序来执行此操作(使用node)

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

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

                        【讨论】:

                        • 这不是像用F16杀掉花园里的杂草吗?
                        【解决方案23】:
                        wc -l file.txt | cut -f3 -d" "
                        

                        只返回行数

                        【讨论】:

                          【解决方案24】:

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

                          cat -n <filename>
                          

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

                          【讨论】:

                            【解决方案25】:

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

                            perl -lne 'END { print $. }'
                            

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

                            【讨论】:

                            • 不起作用:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
                            • @VeikkoW 为我工作。如果您使用的是 Windows,则适用不同的引用规则;但 OP 询问了 Linux / Bash。
                            • perl -lne '}{ print $. ' 也是如此。
                            【解决方案26】:

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

                            wc -l file

                            其他包括

                            awk 'END{print NR}' file

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

                            grep -c ".*" file
                            

                            【讨论】:

                            • 是的,但是wc -l file 会为您提供行数和文件名,以获取您可以执行的文件名:filename.wc -l &lt; /filepath/filename.ext
                            • 使用 GNU grep -H 参数返回文件名和计数。 grep -Hc ".*" file
                            • 我投票给这个解决方案是因为wc -l 计算换行符而不是文件中的实际行。此答案中包含的所有其他命令将为您提供正确的编号,以防您需要这些行。
                            【解决方案27】:

                            使用wc:

                            wc -l <filename>
                            

                            【讨论】:

                              【解决方案28】:
                              wc -l <file.txt>
                              

                              或者

                              command | wc -l
                              

                              【讨论】:

                                猜你喜欢
                                • 2015-06-26
                                • 1970-01-01
                                • 2017-02-16
                                • 1970-01-01
                                • 1970-01-01
                                • 2015-01-08
                                • 1970-01-01
                                • 2018-03-13
                                • 2015-02-11
                                相关资源
                                最近更新 更多