首页 文章

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

提问于
浏览
74

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

  • 139

    我通常使用bash的“后退”功能

    export NUM_LINES=`wc -l filename`
    

    注意'tick'是'后退',例如`不是正常的单引号

  • -3

    wc 可以't get the filename if you don' t给它一个 .

    wc -l < "$JAVA_TAGS_FILE"
    
  • 15

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

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

    改用它

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

    甚至更好(感谢gniourf_gniourf):

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

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

  • 3

    使用您自己的数据的示例

    您可以使用 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打印文件名的唯一时间是它作为参数传递,而不是作为标准输入的数据传递 . 在某些情况下,您可能希望打印文件名,因此了解何时显示它是有用的 .

  • 5

    你也可以使用awk:

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

    要么

    awk 'END {print NR}' filename

  • 12

    这很简单:

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

    要么

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

相关问题