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`
注意'剔'是'后退',例如`不是正常的单引号