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`
Обратите внимание, что "тик" - это "обратный тик", например. `не нормальная одиночная кавычка