Bash количество эхо-строк строк, заданных в переменной bash без имени файла

У меня есть следующие три конструкции в bash script:

NUMOFLINES=$(wc -l $JAVA_TAGS_FILE)
echo $NUMOFLINES" lines"

echo $(wc -l $JAVA_TAGS_FILE)" lines"

echo "$(wc -l $JAVA_TAGS_FILE) lines"

И оба они производят идентичный вывод при запуске script:

121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines

т.е. имя файла также эхом (что я не хочу). Почему эти скрипты терпят неудачу и как я могу вывести чистую:

121711 lines

?

Ответ 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"

Ответ 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)

Примечание: также работает awk-подход chilicuil.

Ответ 5

Это очень просто:

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

или

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

Ответ 6

Обычно я использую функцию "назад тикать" bash

export NUM_LINES=`wc -l filename`

Обратите внимание, что "тик" - это "обратный тик", например. `не нормальная одиночная кавычка