wc -l file.txt
выводит количество строк и имя файла.
Мне нужно только само число (не имя файла).
Я могу это сделать
wc -l file.txt | awk '{print $1}'
Но может быть, есть лучший способ?
wc -l file.txt
выводит количество строк и имя файла.
Мне нужно только само число (не имя файла).
Я могу это сделать
wc -l file.txt | awk '{print $1}'
Но может быть, есть лучший способ?
Попробуйте следующим образом:
wc -l < file.txt
cat file.txt | wc -l
В соответствии с справочная страница (для версии BSD у меня нет версии GNU для проверки):
Если файлы не указаны, используется стандартный ввод и файл имя отображается. Запрос будет принимать ввод до получения EOF или [^ D] в большинство сред.
Чтобы сделать это без ведущего пространства, почему бы и нет:
wc -l < file.txt | bc
Как насчет
wc -l file.txt | cut -d' ' -f1
то есть. выведите выход wc
в cut
(где разделители являются пробелами и выбирают только первое поле)
Как насчет
grep -ch "^" file.txt
У меня была похожая проблема, когда я пытался получить количество символов без начальных пробелов, предоставленных wc
, что привело меня к этой странице. После опробования ответов ниже приведены результаты моего личного тестирования на Mac (BSD Bash). Опять же, это для подсчета символов; для подсчета строк вы бы сделали wc -l
. echo -n
пропускает разрыв задней строки.
FOO="bar"
echo -n "$FOO" | wc -c # " 3" (x)
echo -n "$FOO" | wc -c | bc # "3" (√)
echo -n "$FOO" | wc -c | tr -d ' ' # "3" (√)
echo -n "$FOO" | wc -c | awk '{print $1}' # "3" (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1 # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8 # "3" (√)
echo -n "$FOO" | wc -c | perl -pe 's/^\s+//' # "3" (√)
echo -n "$FOO" | wc -c | grep -ch '^' # "1" (x)
echo $( printf '%s' "$FOO" | wc -c ) # "3" (√)
Я бы не стал полагаться на метод cut -f*
в целом, поскольку он требует, чтобы вы знали точное количество начальных пробелов, которое может иметь любой заданный вывод. И grep
работает для подсчета строк, но не для символов.
bc
является наиболее лаконичным, а awk
и perl
кажутся немного излишними, но все они должны быть относительно быстрыми и достаточно портативными.
Также обратите внимание, что некоторые из них могут быть адаптированы для обрезки окружающего пробела из общих строк (наряду с echo 'echo $FOO'
, еще одним изящным приемом).
Очевидно, есть много решений. Вот еще один:
wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"
Это выводит только количество строк, но присутствует символ новой строки (\n
), если вы этого не хотите, замените [:blank:]
на [:space:]
.
Лучший способ - в первую очередь найти все файлы в каталоге, а затем использовать AWK NR (количество переменных записей)
ниже приведена команда:
find <directory path> -type f | awk 'END{print NR}'
пример: - find /tmp/ -type f | awk 'END{print NR}'
Это работает для меня, используя обычные wc -l
и sed
, чтобы убрать любой символ, который не является числом.
wc -l big_file.log | sed -E "s/([a-z\-\_\.]|[[:space:]]*)//g"
# 9249133