【问题标题】:bash echo number of lines of file given in a bash variable without the file namebash echo 在没有文件名的 bash 变量中给出的文件行数
【发布时间】:2012-08-14 21:03:55
【问题描述】:

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

?

【问题讨论】:

标签: bash wc


【解决方案1】:

使用您自己的数据的示例

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

【讨论】:

  • 请注意,如果最后一行没有以行尾字符结尾,则此方法将不包括最后一行。请参阅下面的修复。
【解决方案2】:

wc 不给就不能得到文件名。

wc -l < "$JAVA_TAGS_FILE"

【讨论】:

  • 好吧,那就不要了。只需将文件传递给wc 的标准输入,如答案所示。所以cat "$JAVA_TAGS_FILE" | wc -l 或等价的wc -l &lt; "$JAVA_TAGS_FILE"。这样,wc 只获取原始数据,而不是文件名。
【解决方案3】:

你也可以使用awk:

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

或者

awk 'END {print NR}' filename

【讨论】:

    【解决方案4】:

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

    其实wc的方法有个问题:如果不是以行尾符号结束,就不算最后一行。

    改用这个

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

    甚至更好(感谢 gniourf_gniourf):

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

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

    【讨论】:

    • 非常复杂的方法!也许你会想要 nblines=$(grep -c '' file) 代替(这是在这种情况下计算不完整行的规范方法)。请注意,根据 POSIX,您计算的是 incomplete lines(而不是 lines)。您实际上是在处理二进制文件而不是 text file
    • @gniourf_gniourf 谢谢,我不知道,它工作得很好,而且更简洁。
    • 这可能是更好的解决方案nblines=$(($(cat "file.txt" | wc -l) + 1))
    【解决方案5】:

    很简单:

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

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

    【讨论】:

    • 第一个是cat没用。
    • @kap 不,它只是看起来像这样。如果您摆脱了cat,那么您将获得第二个示例,因为wc -l 在仅与文件一起使用时返回2 列。
    【解决方案6】:

    我通常使用 bash 的 'back tick' 功能

    export NUM_LINES=`wc -l filename`
    

    请注意,“勾号”是“后勾号”,例如` 不是普通的单引号

    【讨论】:

    • 这只是一种不同的表示法,并不能解决文件名是结果的一部分的问题。
    猜你喜欢
    • 2015-12-06
    • 2012-08-08
    • 2016-02-02
    • 2018-11-26
    • 1970-01-01
    • 2014-10-01
    • 2015-12-09
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多