bash回显bash变量中给出的文件行数,不带文件名


79

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


Answers:


157

使用自己的数据的示例

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

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

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

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

# 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
请注意,如果最后一行不以行末字符终止,则此方法将不包括最后一行。请参阅下面的修复程序。
2015年

15

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

wc -l < "$JAVA_TAGS_FILE"

2
好吧,那就不要。wc如答案所示,只需将文件传递到的stdin即可。因此,cat "$JAVA_TAGS_FILE" | wc -l或等价地wc -l < "$JAVA_TAGS_FILE"。这样,wc仅获取原始数据,而不获取文件名。
Witiko


5

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

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

改用这个

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

甚至更好(感谢gniourf_gniourf):

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

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


2
非常费解的方法!也许您会想要nblines=$(grep -c '' file)代替(在这种情况下,这是计数不完整行的规范方法)。请注意,尽管根据POSIX,您是在计算不完整的行(而不是lines)。实际上,您正在处理的是二进制文件,而不是文本文件
gniourf_gniourf

@gniourf_gniourf谢谢,我对此一无所知,它很好用,而且更加简洁。
2015年

它可能是更好的解决方案nblines=$(($(cat "file.txt" | wc -l) + 1))
Andrey Izman

3

这很简单:

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

要么

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

首先是猫的无用。
卡普

@kap不,它看起来像这样。如果您摆脱了cat,那么将有第二个示例,因为wc -l仅在与文件一起使用时会返回2列。
Slava Semushin

-3

我通常使用bash的“ back tick”功能

export NUM_LINES=`wc -l filename`

注意,“ tick”是“ back tick”,例如`不是正常的单引号


5
那只是一种不同的表示法,并不能解决文件名成为结果一部分的问题。
Izzy 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.