Ответы:
Стандартный способ - with wc
, который принимает аргументы для указания того, что он должен считать (байты, символы, слова и т. Д.); -l
для строк:
$ wc -l file.txt
1020 file.txt
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
. /regexp/d
удаляет строку, если она совпадает regexp
, и -e
включает соответствующий (IMNSHO) синтаксис для regexp
.
grep -v '^+ *%' matlab.git.diff | wc -l
?
grep
команду, чтобы рассматривать в качестве комментариев такие случаи " + Hello"
(обратите внимание на пробел (ы) перед +
)?
grep -v '^ *+' matlab.git.diff | wc -l
(Я предполагаю, что кавычки на самом деле не должны были быть частью строки; я также предполагаю, что обе строки с пробелами перед пробелами и без +
них должны быть комментариями; если в как минимум один пробел является обязательным, либо заменить звезду *
с \+
, или просто добавить еще один пробел перед звездой). Возможно, вместо сопоставления только пробелов, вы захотите сопоставить произвольные пробелы; для этого замените пробел на [[:space:]]
. Обратите внимание, что я также удалил соответствие, %
поскольку это не в вашем примере.
Как сказал Майкл, wc -l
это путь. Но, на всякий случай , если вы необъяснимо есть bash
, perl
или , awk
но не wc
, вот несколько решений:
$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT
$ perl -lne 'END { print $. }' file.txt
и гораздо менее читаемый:
$ perl -lne '}{ print $.' file.txt
$ awk 'END {print NR}' file.txt
Стивен Д забыл GNU sed
:
sed -n '$=' file.txt
Кроме того, если вы хотите подсчет без вывода имени файла, и вы используете wc
:
wc -l < file.txt
Просто ради этого:
cat -n file.txt | tail -n 1 | cut -f1
grep -c ''
, или tr -dc '\n' | wc -c
, или nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
... Является ли что-нибудь из этого полезным само по себе (в отличие от того, на чем можно основываться, чтобы создать программу, которая делает больше, чем просто подсчет строк), кроме wc -l
чистого (ba) sh?
sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
и вы можете cut -c -7
сохранить только номер. Или, более положительно uniq -c file.txt | awk '{c+=$1}END{print c}'
. Как насчет dc
(хотя это не POSIX)? uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -
, bc
является POSIX: uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc
. Самый простой ответ , если вы предполагаете , ограниченную длину строки: uniq -c -f 100000 file.txt
.
Слово предупреждения при использовании
wc -l
потому что wc -l функционирует путем подсчета \ n, если последняя строка в вашем файле не заканчивается новой строкой, счетчик строк будет отключен на 1. (следовательно, старое соглашение оставляло символ новой строки в конце вашего файла)
Поскольку я никогда не могу быть уверен в том, что какой-либо из указанных файлов следует условию окончания последней строки новой строкой или нет, я рекомендую использовать любую из этих альтернативных команд, которая будет включать последнюю строку в число независимо от новой строки или нет.
sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename
В случае, если у вас есть только bash и абсолютно отсутствуют внешние инструменты, вы также можете сделать следующее:
count=0
while read
do
((count=$count+1))
done <file.txt
echo $count
Объяснение: цикл считывает стандартный ввод построчно ( read
так как мы все равно ничего не делаем с вводом чтения, переменная для его сохранения не предоставляется) и увеличивает переменную count
каждый раз. Из-за перенаправления ( <file.txt
после done
), стандартный вход для цикла от file.txt
.