81

我在 bash 脚本中有以下三个结构:

NUMOFLINES=$(wc -l $JAVA_TAGS_FILE)
echo $NUMOFLINES" lines"

echo $(wc -l $JAVA_TAGS_FILE)" lines"

echo "$(wc -l $JAVA_TAGS_FILE) lines"

当脚本运行时,它们都会产生相同的输出:

121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines

即文件的名称也被回显(我不想这样做)。为什么这些脚本会失败,我应该如何输出一个干净的:

121711 lines

?

4

6 回答 6

160

使用您自己的数据的示例

您可以避免将文件名嵌入到NUMOFLINES变量中,方法是使用来自JAVA_TAGS_FILE的重定向,而不是将文件名作为参数传递给wc。例如:

NUMOFLINES=$(wc -l < "$JAVA_TAGS_FILE")

说明:使用管道或重定向来避免输出中的文件名

如果输入来自管道或重定向操作符,wc 实用程序将不会在其输出中打印文件名考虑这些不同的例子:

# wc shows filename when the file is an argument
$ wc -l /etc/passwd
41 /etc/passwd

# filename is ignored when piped in on standard input
$ cat /etc/passwd | wc -l
41

# unusual redirection, but wc still ignores the filename
$ < /etc/passwd wc -l
41

# typical redirection, taking standard input from a file
$ wc -l < /etc/passwd
41

如您所见,wc打印文件名的唯一时间是它作为参数传递,而不是作为标准输入上的数据传递。在某些情况下,您可能希望打印文件名,因此了解它何时显示很有用。

于 2012-08-18T21:31:02.690 回答
15

wc如果您不提供文件名,则无法获取文件名。

wc -l < "$JAVA_TAGS_FILE"
于 2012-08-18T21:17:53.503 回答
12

您还可以使用 awk:

awk 'END {print NR,"lines"}' filename

或者

awk 'END {print NR}' filename

于 2015-08-11T12:33:09.073 回答
6

(适用于 Mac,可能还有其他 Unix)

实际上 wc 方法存在一个问题:如果它不以行尾符号终止,则它不计算最后一行。

改用这个

nbLines=$(cat -n file.txt | tail -n 1 | cut -f1 | xargs)

甚至更好(感谢 gniourf_gniourf):

nblines=$(grep -c '' file.txt)

注意:chilicuil 的 awk 方法也有效。

于 2015-10-18T05:32:13.373 回答
3

这是一个非常简单的:

NUMOFLINES=$(cat $JAVA_TAGS_FILE | wc -l )

或者

NUMOFLINES=$(wc -l $JAVA_TAGS_FILE | awk '{print $1}')
于 2012-08-18T21:18:35.853 回答
-3

我通常使用 bash 的“反勾号”功能

export NUM_LINES=`wc -l filename`

注意 'tick' 是 'back tick' 例如 ` 不是普通的单引号

于 2014-07-18T12:45:56.267 回答