135

有没有办法获取 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

4

19 回答 19

99

有史以来最简单的答案:

wc < filename 
于 2012-01-29T13:31:33.337 回答
90

只是:

wc -l < file_name

将完成这项工作。但是这个输出包括前缀空格作为wc右对齐数字。

于 2013-04-08T14:47:33.800 回答
63

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

lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`
于 2010-09-19T18:40:31.827 回答
53
wc $file | awk {'print "$4" "$2" "$1"'}

根据您的布局进行调整。

使用正逻辑(“是文件”)而不是负逻辑(“不是目录”)也更好

[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}
于 2010-09-19T18:40:06.910 回答
46

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

在 OS X 中:

$ echo aa | wc -l

         1

在 Centos 中:

$ echo aa | wc -l

1

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

$ echo aa | wc -l | tr -d ' '
于 2015-10-26T21:55:33.710 回答
31

接受/流行的答案在 OSX 上不起作用

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

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

或者

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

或者

wc -l "$f" | awk '{print $1}'
于 2016-01-28T05:41:18.173 回答
12

如果将文件名重定向到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 ...)
于 2010-09-19T22:27:42.063 回答
2

怎么样sed

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'
于 2012-12-28T03:44:46.757 回答
2

如果文件很小,您可以调用wc两次,并使用类似以下的内容,这样可以避免管道进入额外的进程:

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

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

如果您需要行数或字数此解决方案更有意义。

于 2015-06-25T14:18:59.150 回答
1
typeset -i a=$(wc -l fileName.dat  | xargs echo | cut -d' ' -f1)
于 2012-07-04T13:17:03.483 回答
0

试试这个数字结果:
nlines=$( wc -l <​​ $myfile )

于 2013-06-28T14:20:11.723 回答
0

这样的事情可能会有所帮助:

#!/bin/bash
printf '%-10s %-10s %-10s\n' 'File' 'Lines' 'Words'
for fname in file_name_pattern*; {
    [[ -d $fname ]] && continue
    lines=0
    words=()
    while read -r line; do
        ((lines++))
        words+=($line)
    done < "$fname"
    printf '%-10s %-10s %-10s\n' "$fname" "$lines" "${#words[@]}"
}
于 2020-12-17T19:06:54.220 回答
0

要(1)运行wc一次,(2)不分配任何多余的变量,请使用

read lines words <<< $(wc < $f | awk '{ print $1, $2 }')

完整代码:

for f in *
do
    if [ ! -d $f ]
    then
        read lines words <<< $(wc < $f | awk '{ print $1, $2 }')
        echo "$f $lines $words"
    fi
done

示例输出:

$ find . -maxdepth 1 -type f -exec wc {} \; # without formatting
 1  2 27 ./CNAME
  21  169 1065 ./LICENSE
 33 130 961 ./README.md
  86  215 2997 ./404.html
  71  168 2579 ./index.html
 21  21 478 ./sitemap.xml

$ # the above code
404.html 86 215
CNAME 1 2
index.html 71 168
LICENSE 21 169
README.md 33 130
sitemap.xml 21 21
于 2020-12-17T19:24:25.553 回答
0

已回答问题中提出的解决方案不适用于达尔文内核。

请考虑以下适用于所有 UNIX 系统的解决方案:

  1. 准确打印文件的行数:
wc -l < file.txt | xargs
  1. 准确打印文件的字符数:
wc -m < file.txt | xargs
  1. 准确打印文件的字节数:
wc -c < file.txt | xargs
  1. 准确打印文件的字数:
wc -w < file.txt | xargs
于 2021-07-26T09:47:39.393 回答
0

这里有一个很好的解决方案,上面有关于 stackoverflow 的示例

我将在这里复制最简单的解决方案:

FOO="bar"
echo -n "$FOO" | wc -l | bc                     # "3"

也许这些页面应该合并?

于 2022-01-30T20:56:19.420 回答
-1

试试这个:

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

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

于 2010-09-19T18:43:32.960 回答
-1

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

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

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

于 2017-06-13T14:25:57.143 回答
-1
files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"
于 2017-11-13T14:25:13.097 回答
-1

您必须使用输入重定向wc

number_of_lines=$(wc -l <myfile.txt)

分别在您的上下文中

echo "$f $(wc -l <"$f") $(wc -w <"$f")"
于 2020-12-16T14:09:51.703 回答