Когда подсчет строк дает неожиданные результаты, мы должны проверить, понимает ли каждая утилита обработки текста, что такое строка, одинаково. Обычно это сводится к двум вопросам:
1) Проблемы преобразования файлов: какие символы используются в качестве EOL (конец строки, он же перевод строки или разрыв строки)? Это может быть \r
, \n
или \r\n
в зависимости от ОС.
2) Самая последняя строка также завершается EOL? Если нет, то как с этим справляются утилиты обработки текста?
В данном случае второй вопрос вел к объяснению.
Что считает wc -l
?
Непосредственно из справочной страницы:
-l, --lines вывести счетчик новой строки
Очевидно, что последняя строка не считается, если она не завершается символом новой строки, т.е. на одну меньше, чем реальное количество строк.
Что производит grep
?
grep
завершает каждую строку вывода символом новой строки. В документации не нашел, только проверял.
Теперь мы можем сделать тест, чтобы объяснить поведение, описанное в вопросе:
echo -ne "first\nsecond\n Third" > 3lines. txt
tail -1 3lines.txt | od -c
Хорошо, нет '\n'.
wc -l < 3lines.txt
Вывод: 2 (последняя строка не считается, так как отсутствует последняя новая строка)
grep . < 3 строки.текст | wc -l
Вывод равен 3 (подсчитаны все строки, так как не пропущено ни одной новой строки)
grep -v first < 3lines.txt | wc -l
Вывод равен 2 (снова подсчитаны все строки).
Факт нахождения в сети государственного учреждения имел значение. Порт 123 (используемый по умолчанию для синхронизации) был закрыт, поэтому использование -u
(который связывается с ntp-сервером через непривилегированный порт) было решением:
$sudo ntpdate -u pool.ntp.org
26 Jan 10:03:48 ntpdate[5080]: adjust time server 158.227.98.15 offset 0.005423 sec
и теперь на панели отображается правильное время.