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

时间:2012-08-18 21:15:58

标签: bash wc

我在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

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

121711 lines

6 个答案:

答案 0 :(得分:145)

使用您自己的数据的示例

您可以使用 JAVA_TAGS_FILE 中的重定向来避免将文件名嵌入 NUMOFLINES 变量中,而不是将文件名作为参数传递给 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 唯一一次打印文件名的时间是作为参数传递,而不是作为标准输入的数据。在某些情况下,您可能希望打印文件名,因此了解何时显示它是有用的。

答案 1 :(得分:15)

wc无法获取文件名,如果你不给它。

wc -l < "$JAVA_TAGS_FILE"

答案 2 :(得分:12)

您也可以使用awk:

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

awk 'END {print NR}' filename

答案 3 :(得分:5)

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

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

改为使用

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

甚至更好(感谢gniourf_gniourf):

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

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

答案 4 :(得分:3)

这很简单:

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

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

答案 5 :(得分:-3)

我通常使用&#39; back tick&#39; bash的特点

export NUM_LINES=`wc -l filename`

请注意&#39; tick&#39;是&#39;返回标记&#39;例如“不是正常的单引号