Відповіді:
Стандартний спосіб - це метод 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
Стівен D забув 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
чистого (ба) ш?
sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
і ви можете cut -c -7
зберегти лише число. Або, більш POSIXly: 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
.