从bash中获取wc中的整数

get just the integer from wc in bash

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

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

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

1
2
3
4
5
6
7
8
9
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


最简单的回答:

1
wc < filename


只是:

1
wc -l < file_name

会做的。但是此输出包括前缀空格,因为wc右对齐数字。


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

根据您的布局进行调整。

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

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


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

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


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

在OS X中:

1
2
3
$ echo aa | wc -l

         1

在Centos:

1
2
3
$ echo aa | wc -l

1

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

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

接受/流行的答案不适用于OSX。

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

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

要么

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

要么

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


如果将文件名重定向到wc,则会在输出时省略文件名。

击:

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

要么

1
2
3
read lines words characters <<EOF
$(wc < filename)
EOF

而不是使用for迭代ls的输出,执行以下操作:

1
for f in *

如果有包含空格的文件名,它将起作用。

如果你不能使用globbing,你应该管道进入while read循环:

1
find ... | while read -r f

或使用过程替代

1
2
3
4
while read -r f
do
    something
done < <(find ...)


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

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

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

如果您需要linecount或wordcount,此解决方案更有意义。


sed怎么样?

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

试试这个数字结果:
nlines = $(wc -l


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


"Basically I want to write the line numbers and word counts to the screen after the file name."

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

产出:
myfile.txt文件
线:10
字数:20
字节:120


1
typeset -i a=$(wc -l fileName.dat  | xargs echo | cut -d' ' -f1)

试试这个:

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

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


另一种方式,类似于@BananaNeil发布的内容:

1
$ cat myfile.txt | wc -l