在 bash 中只从 wc 获取整数

有没有一种方法可以得到 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

104913 次浏览
wc $file | awk {'print "$4" "$2" "$1"'}

根据布局的需要进行调整。

使用正面逻辑(“是一个文件”)比使用负面逻辑(“不是一个目录”)更好

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

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

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

试试这个:

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

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

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

巴斯:

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

或者

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

不要使用 for迭代 ls的输出,而是这样做:

for f in *

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

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

find ... | while read -r f

或使用进程替代

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

有史以来最简单的回答:

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

sed怎么样?

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

只要:

wc -l < file_name

但是这个输出包括前缀空格,因为 wc将数字右对齐。

对于数字结果,请尝试以下操作:
Nlines = $(wc-l < $myfile)

如果文件很小,你可以调用 wc两次,并使用下面这样的方法,这样就可以避免进入额外的进程:

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

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

这个解决方案更有意义,如果你需要 都不是的行数 或者的字数。

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

在 OS X 中:

$ echo aa | wc -l


1

在森托斯:

$ echo aa | wc -l


1

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

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

公认的/流行的答案在 OSX 上做 没有工作。

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

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

或者

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

或者

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

“基本上,我想把行号和字数写到文件名后面的屏幕上。”

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

产出: Myfile.txt 线路: 10 单词: 20 字节: 120

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

对于 wc,必须使用输入重定向:

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

在你的语境中

echo "$f $(wc -l <"$f") $(wc -w <"$f")"

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

#!/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[@]}"
}

要(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

回答问题中提出的解决方案不适用于 Darwin 内核。

请考虑适用于所有 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

有一个很好的解决方案与例子堆栈溢出 给你

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

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

也许这几页应该合并?