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

Mar*_*tus 79 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"
Run Code Online (Sandbox Code Playgroud)

并且在脚本运行时它们都产生相同的输出:

121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines
Run Code Online (Sandbox Code Playgroud)

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

121711 lines
Run Code Online (Sandbox Code Playgroud)

Tod*_*obs 151

使用您自己的数据的示例

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

NUMOFLINES=$(wc -l < "$JAVA_TAGS_FILE")
Run Code Online (Sandbox Code Playgroud)

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

厕所,如果输入从管道或重定向操作采取实用程序将无法在其输出打印的文件的名称.考虑以下各种示例:

# 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
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,如果最后一行不是以行尾字符终止,则此方法将不包括最后一行。请参阅下面我的修复。 (2认同)

Ign*_*ams 15

wc 如果你不给它一个文件名,则无法获取文件名.

wc -l < "$JAVA_TAGS_FILE"
Run Code Online (Sandbox Code Playgroud)

  • 好吧,那就不要了.只需将文件传递给`wc`的stdin,如答案所示.所以`cat"$ JAVA_TAGS_FILE"| wc -l`或等效地,`wc -l <​​"$ JAVA_TAGS_FILE"`.这样,`wc`只获取原始数据,而不是文件名. (2认同)

Jav*_*pez 12

你也可以使用awk:

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

要么

awk 'END {print NR}' filename


lin*_*ing 5

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

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

请改用它

nbLines=$(cat -n file.txt | tail -n 1 | cut -f1 | xargs)
Run Code Online (Sandbox Code Playgroud)

甚至更好(感谢gniourf_gniourf):

nblines=$(grep -c '' file.txt)
Run Code Online (Sandbox Code Playgroud)

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

  • 非常复杂的方法!也许你会想要`nblines = $(grep -c''file)`(这是在这种情况下计算不完整行的规范方法).请注意,根据POSIX,您计算[不完整的行](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_195)(而不是[行](http:/ /pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_206)).您实际上处理的是二进制文件,而不是[文本文件](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_397). (2认同)