У меня есть следующие три конструкции в сценарии 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
?
Ответы:
Пример использования ваших собственных данных
Вы можете избежать включения вашего имени файла в переменную NUMOFLINES , используя перенаправление из JAVA_TAGS_FILE , вместо того, чтобы передавать имя файла в качестве аргумента в wc . Например:
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 печатает имя файла только тогда, когда оно передается как аргумент, а не как данные на стандартный ввод. В некоторых случаях может потребоваться напечатать имя файла, поэтому полезно понимать, когда оно будет отображаться.
источник
wc
не может получить имя файла, если вы его не укажете.wc -l < "$JAVA_TAGS_FILE"
источник
wc
ввод, как показано в ответе. Такcat "$JAVA_TAGS_FILE" | wc -l
или, что то же самое,wc -l < "$JAVA_TAGS_FILE"
. Таким образом, будутwc
получены только необработанные данные, а не имя файла.Вы также можете использовать awk:
awk 'END {print NR,"lines"}' filename
Или же
awk 'END {print NR}' filename
источник
(применимо к Mac и, возможно, к другим Unix)
На самом деле есть проблема с подходом wc: он не считает последнюю строку, если она не заканчивается символом конца строки.
Используйте это вместо
или даже лучше (спасибо gniourf_gniourf):
nblines=$(grep -c '' file.txt)
Примечание. Подход awk от chilicuil также работает.
источник
nblines=$(grep -c '' file)
вместо этого (в данном случае это канонический способ подсчета неполных строк). Однако обратите внимание, что согласно POSIX вы учитываете неполные строки (а не строки ). Фактически вы имеете дело с двоичным файлом, а не с текстовым файлом .nblines=$(($(cat "file.txt" | wc -l) + 1))
Это очень просто:
NUMOFLINES=$(cat $JAVA_TAGS_FILE | wc -l )
или же
NUMOFLINES=$(wc -l $JAVA_TAGS_FILE | awk '{print $1}')
источник
cat
, у вас будет второй пример, потому что онwc -l
возвращает 2 столбца, когда он используется только с файлом.Обычно я использую функцию «обратного тика» в bash
export NUM_LINES=`wc -l filename`
Обратите внимание, что «галочка» - это «обратная галочка», например, «не обычная одинарная кавычка».
источник