如何使“ wc -l”仅打印不带文件名的行数?


154
wc -l file.txt

输出行数和文件名。

我只需要数字本身(而不是文件名)。

我可以做这个

 wc -l file.txt | awk '{print $1}'

但是也许有更好的方法?


13
wc -l < file.txt准确,简洁地完成工作。
乔纳森·勒夫勒


3
这是我现在查询过两次的问题。wc的这种行为对于-nix通常的简洁性是不直观和反范式的。简洁是有原因的,因为您确实不想解决各种蓬松的冗余问题。毕竟,我知道文件名,不是吗?我想要的是行数。
彼得-恢复莫妮卡

Answers:


216

尝试这种方式:

wc -l < file.txt

5
在AIX,ksh中,数字之前总是有一个空格。我们必须使用| awk'{print $ 1}'或剪切,以修剪空格。修剪的另一种方法是用回声将其包围。
rao 2014年

@rao是正确的,这将在数字之前添加一个空格。我的解决方案解决了这个问题,并且比awk或cut更简单。
Desi Cochrane

@rao bash没有空格。该空间从哪里来?wc -l不应该发出一个,为什么ksh在程序的标准输出前加上空格?
彼得-恢复莫妮卡的时间

尽管这是正确的解决方法(而且很容易就不会修改wc),但它可能会更慢且不直观。首先,我希望4711 [stdin]输出类似。
彼得-恢复莫妮卡

还可以考虑与配对printf "%'d",这样可以节省空间并很好地打印出大量数字。
狮子座

21
cat file.txt | wc -l

根据手册页(对于BSD版本,我没有要检查的GNU版本):

如果未指定文件,则使用标准输入,并且不显示文件名。该提示将接受输入,直到接收到EOF为止,或者在大多数环境中为[^ D]。


3
我不喜欢猫-串联会消耗很多时间。
PoGibas

9
wc -l < file.txt具有相同的效果。
pjmorse 2012年

@user:进行测试。到目前为止,最慢的部分是从磁盘读取文件。
sarnold

11
@ user1286528然后使用wc -l < file.txt以避免猫的无用。尽管如果您认为那会浪费任何明显的时间,那绝对是疯了。
hobbs 2012年

12

要在没有领先空间的情况下执行此操作,为什么不这样做:

wc -l < file.txt | bc

我与此相关的语法错误(Ubuntu 14.04)。我认为文件名有问题。
MERose

在RHEL 6.7上,它引发错误:$ wc -l file.csv | bc(standard_in)1:语法错误(standard_in)1:非法字符:N(standard_in)1:语法错误(standard_in)1:语法错误
Rodrigo Hjort

3
我也遇到了解析错误,但是您可以将其与其他答案结合使用,wc -l < file.txt以解决解析错误并删除空格:wc -l < file.txt | bc
jangosteve

11

怎么样

wc -l file.txt | cut -d' ' -f1

即,将输出的内容wc输入到cut(其中分隔符为空格并仅选择第一个字段)


4
这并不比wc -l file.txt | awk '{print $1}'OP尝试的要好。
doubleDown

1
wc -l < file.txt方法快。但是必须| cut -d' ' -f2在BSD上使用,只要该wc命令返回一个前导空格,例如:“ 34068289 file.txt”,而不是“ 34068289 file.txt”。
Sopalajo de Arrierez

@doubleDown好,使用awk就像使用CNC机器切割木板而不是锯。用锯子锯。
彼得-恢复莫妮卡

5

技术比较

我也遇到类似的问题,试图在没有提供的领先空白的情况下获取字符数wc,这导致我进入了此页面。在这里尝试答案之后,以下是我在Mac(BSD Bash)上进行的个人测试的结果。同样,这是为了字符计数;行数你会做的wc -lecho -n省略尾随换行符。

FOO="bar"
echo -n "$FOO" | wc -c                          # "       3"    (x)
echo -n "$FOO" | wc -c | bc                     # "3"           (√)
echo -n "$FOO" | wc -c | tr -d ' '              # "3"           (√)
echo -n "$FOO" | wc -c | awk '{print $1}'       # "3"           (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1         # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8         # "3"           (√)
echo -n "$FOO" | wc -c | perl -pe 's/^\s+//'    # "3"           (√)
echo -n "$FOO" | wc -c | grep -ch '^'           # "1"           (x)
echo $( printf '%s' "$FOO" | wc -c )            # "3"           (√)

cut -f*一般不会依赖该方法,因为它要求您知道任何给定输出可能具有的前导空格的确切数量。和grep一个适用于计数行,而不是文字。

bc是最简洁的,并且awkperl显得有些矫枉过正,但他们都应该是比较快和便携不够。

还要注意,其中一些还可以调整为从通用字符串中修剪周围的空白(以及echo `echo $FOO`另一个巧妙的技巧)。


1
echo $(printf '%s' "$FOO" | wc -c)echo使用命令替换不是没有用的罕见情况之一。
三月

@tripleee哇...根据您的代码,echo `echo $FOO`;也像对变量使用String.trim()命令一样!非常方便。我还将您的行添加到我的答案中。
Beejor

也许关于上下文,另请参见何时将引号括在shell变量周围
Tripleee '18


4

怎么样

grep -ch "^" file.txt

3
真好 非常原始的/创造性的使用,grep但是检查一下,结果(毫不奇怪)比wc我的测试中的简单/直接方法慢2到6倍。
arielf

3

显然,有很多解决方案。这是另外一个:

wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"

这只会输出行数,但是会出现尾随换行符(\n),如果您不希望使用任一行,请替换[:blank:][:space:]


当文件名中包含数字时,会出现问题。例如,对于文件test9在它1线,输出将是19
圣拉斐尔Ahrens的

1

最好的方法是首先在目录中找到所有文件,然后使用AWK NR(记录数变量)

下面是命令:

find <directory path>  -type f | awk  'END{print NR}'

例如:- find /tmp/ -type f | awk 'END{print NR}'


0

这适用于我使用普通模式wc -lsed去除任何不是数字的字符。

wc -l big_file.log | sed -E "s/([a-z\-\_\.]|[[:space:]]*)//g"

# 9249133
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.