我有这样的线,我想知道我有多少行。

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


当前回答

这个drop-in便携式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:]]}
}

除了bash和zsh之外,它应该完全兼容所有posix兼容的shell。

其他回答

如果你想检查一个目录中所有文件的行数,你可以使用find和wc:

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

Wc -l不计算行数。

是的,这个答案可能有点晚了,但我还没有发现任何人在答案中记录了更健壮的解决方案。

与流行的观点相反,POSIX根本不要求文件以换行符结束。是的,POSIX 3.206 Line的定义如下:

由零个或多个非换行>字符加上一个终止字符组成的序列。

然而,很多人不知道的是,POSIX还将POSIX 3.195不完全行定义为:

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

因此,没有末尾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来计算行数。这个解决方案更加健壮和精确,它支持文件中一行的所有不同风格:

POSIX 3.75空行 POSIX 3.145空线 POSIX 3.195不完整的行 POSIX 3.206线

$ grep -c ^ FILE

我只是做了一个程序来做这个(与节点)

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

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

我一直在用这个:

cat myfile.txt | wc -l

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

厕所 -l 我的文件.txt

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

Wc -l < myfile.txt

我可能从现在开始就会用到它。比我要走的路稍短一点。我把我的老方法提出来,以防有人喜欢。这两个方法的输出是相同的。

我知道这很老,但仍然是:数过滤后的行数

我的文件如下:

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

OR

grep -c "OK" filename