bash echo在没有文件名的bashvariables中给出的文件行数

我有一个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 

一个使用自己的数据的例子

您可以通过使用来自JAVA_TAGS_FILE的redirect来避免将文件名embedded到NUMOFLINESvariables中,而不是将文件名作为parameter passing给wc 。 例如:

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

说明:使用pipe道或redirect来避免输出中的文件名

如果input来自pipe道或redirect操作符,则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将打印文件名是当它作为parameter passing,而不是标准input数据。 在某些情况下,您可能需要打印文件名,所以了解何时会显示它是有用的。

如果你不给它, wc就不能得到文件名。

 wc -l < "$JAVA_TAGS_FILE" 

你也可以使用awk:

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

要么

awk 'END {print NR}' filename

这是一个非常简单的:

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

要么

 NUMOFLINES=$(wc -l $JAVA_TAGS_FILE | awk '{print $1}') 

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

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

改用这个

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

甚至更好(谢谢gniourf_gniourf):

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

注意:chilicuil的awk方法也适用。

我通常使用bash的“back tick”function

 export NUM_LINES=`wc -l filename` 

注意'剔'是'后退',例如`不是正常的单引号