在bash中仅从wc获得整数


115

有没有办法得到wc在bash中返回的整数?

基本上,我想在文件名之后将行号和字数写入屏幕。

output: filename linecount wordcount 这是我到目前为止的内容:

files=`ls`
for f in $files;
do
        if [ ! -d $f ] #only print out information about files !directories
        then
                # some way of getting the wc integers into shell variables and then printing them
                echo "$f $lines $ words"
        fi
done

Answers:


57

您可以使用以下cut命令获取wc输出的第一个单词(即行数或单词数):

lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`

5
对同一文件两次运行wc效率低下。
gawi 2010年

3
没错,这就是为什么我认为James Broadhead的答案要好得多。我无法cut处理完整的输出,wc $f因为字段之间的空格数量不同。
卡萨布兰卡

1
@casablanca您可以使用'tr -s'压缩空格数。我在下面的回答中列出了针对此问题的更多便携式解决方案。
卢布

由于在这个答案中我们正在分配一个变量,我们可以使用
cycollins

88

有史以来最简单的答案:

wc < filename 

5
但是不会产生所需的输出。
戴夫牛顿

当然可以,您只需传入您将要使用的适当参数即可。例如,如果这样做wc -c < file name,它将只为您提供整数字节,而没有其他内容。
BananaNeil

13
我的观点是,如果您要回答一个(1.5岁)的问题)不妨将所有信息都放入答案中,仅此
Dave Newton

哎呦,只是重新阅读问题.. #fail,我是研究如何让整数,我是用从其中一个答案,当我发现了一个更好的答案信息,然后决定后了。抱歉..
BananaNeil 2012年

3
您已经回答了Google,这很重要。:-)
Ciro Santilli郝海东冠状病六四事件法轮功

82

只是:

wc -l < file_name

会做的工作。但是此输出包含带前缀的空格,因为它wc使数字右对齐。


3
:为了得到行数没有空格wc -l < foo.txt | xargs裁判- stackoverflow.com/a/12973694/149428
泰勒埃德米斯顿

1
因此,尽管命令产生的前导空格是答案,但发问者正在分配一个变量,并且该变量会自动删除前导空格(至少这是我在较旧的OSX bash上的经验)。换句话说,lines=`wc -l < $f`导致变量“线”的值没有前导空格。
cycollins

如果我使用find怎么办?我收到一个错误: find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l可以正常工作,但会打印每个文件。如果我使用,find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <则会出现错误。parse error near '\n'
NunoGonçalves19年

55
wc $file | awk {'print "$4" "$2" "$1"'}

根据需要调整布局。

使用肯定逻辑(“是文件”)而不是否定(“非目录”)也更好

[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}

1
在我的Windows中,使用Cmder(bash 4.4.12),它的工作原理是:wc $file | awk '{print $4" "$2" "$1}'-之外的撇号{}
Grzegorz Gierlik

36

有时wc在不同平台上以不同格式输出。例如:

在OS X中:

$ echo aa | wc -l

         1

在Centos中:

$ echo aa | wc -l

1

因此,仅使用cut可能无法检索该数字。而是尝试tr删除空格字符:

$ echo aa | wc -l | tr -d ' '

23

接受的/受欢迎的答案不适用于OSX。

以下任何内容都可以在bsd和linux上移植。

wc -l < "$f" | tr -d ' '

要么

wc -l "$f" | tr -s ' ' | cut -d ' ' -f 2

要么

wc -l "$f" | awk '{print $1}'

11

如果将文件名重定向到其中,wc则会忽略输出中的文件名。

重击:

read lines words characters <<< $(wc < filename)

要么

read lines words characters <<EOF
$(wc < filename)
EOF

而不是使用for来遍历的输出,而是ls这样做:

for f in *

如果文件名中包含空格,该选项将起作用。

如果您不能使用通配符,则应使用管道while read循环:

find ... | while read -r f

或使用流程替代

while read -r f
do
    something
done < <(find ...)

无论如何,我支持您,但您无需重定向文件名。只需将其捕获为其他字段即可。read lines words characters filename <<< $(wc "$f")哦,如果您使用*对空格进行了加固,则还希望在使用var时用双引号引起来。
布鲁诺·布罗诺斯基

使用附加变量确实是另一种实现方法,但是如果您不打算使用该变量($f在这种情况下,也许已经在文件名中使用了文件名),则没有必要。另外,OP询问如何获取整数。引用变量是正确的,但是我没有显示该变量的用法,因此我省略了提及这一点。如您所知,for f in *几乎应该始终使用该表单而不是使用的输出ls
暂停,直到另行通知。

我完全同意这ls一点。那会给你奖。partmaps.org/era/unix/award.html#ls
Bruno Bronosky

如果您不想要文件名,则可以执行以下操作:read lines words characters _ <<< $(wc "$f")

@EvanTeitelman:正如您上面的一些评论所讨论的。$_只是一个不同的变量。
暂停,直到另行通知。

3

如果文件很小,您可以负担wc两次调用的费用,并使用如下所示的方法,这样可以避免进行额外的处理:

lines=$((`wc -l "$f"`))
words=$((`wc -w "$f"`))

$((...))是bash 的算术扩展wc在这种情况下,它将从输出中删除所有空格。

该解决方案使更多的意义,如果你需要任何的linecount 该单词计数。


2

怎么样sed

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'


1

尝试此操作以得到数字结果:
nlines = $(wc -l <​​$ myfile)


0

试试这个:

wc `ls` | awk '{ LINE += $1; WC += $2 } END { print "lines: " LINE  " words: " WC }'

它创建一个行数和一个字数(LINE和WC),并使用从wc提取的值增加它们(使用$ 1作为第一列的值,而使用$ 2作为第二列的值),最后打印结果。


0

“基本上,我想在文件名之后将行号和字数写到屏幕上。”

answer=(`wc $f`)
echo -e"${answer[3]}
lines:  ${answer[0]}
words:  ${answer[1]}
bytes:  ${answer[2]}"

输出:myfile.txt行:10个字:20个字节:120


0
files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"

如果您仍在使用perl,最好在Perl中也进行字数统计。一种更经济的方法是通过管道传输到tr -d '[:space:]'
Tripleee,
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.