Почему `tail -n 1` возвращает две строки в этом файле, когда я ожидаю 1 - PullRequest
0 голосов
/ 18 февраля 2019

Файл в этой сущности содержит две длинные строки.

  • Когда я запускаю tail -n 1, возвращаются обе строки (я бы ожидал только последнюю).
  • Когда я запускаю head -n 1 на нем, возвращается только первая строка (как и ожидалось).
  • Когда я запускаю wc -l на нем, он возвращает 1 (я бы ожидал 2).

Если я удаляю один символ из первой или второй строки, то некоторые вещи меняются:

  • [РАЗНОЕ] Когда я запускаю tail -n 1 на нем,возвращается только последняя строка (как и ожидалось).
  • [ЖЕ] Когда я запускаю head -n 1 на нем, возвращается только первая строка (как и ожидалось).
  • [ЖЕ] КогдаЯ запускаю wc -l на нем, он возвращает 1 (я бы ожидал 2).

Что здесь происходит?Почему tail и wc не ведут себя так, как я ожидал бы для этого файла?

Я на OSX 10.14.2, и коллега смог воспроизвести такое же поведение на другой машине.

1 Ответ

0 голосов
/ 19 февраля 2019

После просмотра файла с помощью инструмента шестнадцатеричного дампа, похоже, что в конце файла нет новой строки.Интересно, что gnu coreutils справляется с этим, а bsd coreutils (входит в состав MacOS) - нет.Более подробную информацию можно найти в этом сообщении об обмене стеками.

Утилиты, которые должны работать с текстовыми файлами, могут плохо работать с файлами, которые не заканчиваются символом новой строки;например, исторические утилиты Unix могут игнорировать текст после последней новой строки.Утилиты GNU придерживаются политики приличного поведения с нетекстовыми файлами, как и большинство других современных утилит, но вы все равно можете столкнуться со странным поведением с файлами, в которых отсутствует последняя новая строка¹.

$ hexdump file-with-2-lines.txt
0000000 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
*
0001820 61 61 61 61 61 61 61 61 61 61 61 61 0a 62 62 62
0001830 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62
*
0003000 62
0003001

После редактирования файла (без внесения изменений, просто с помощью редактора, который вводит новые строки в конце файла).

$ hexdump file-with-2-lines.txt
0000000 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
*
0001820 61 61 61 61 61 61 61 61 61 61 61 61 0a 62 62 62
0001830 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62
*
0003000 62 0a
0003002

0a - символ новой строки.

...