Как узнать строки в текстовом файле?

Я пытаюсь использовать что-то в bash, чтобы показать окончательные строки в файле, напечатанном, а не интерпретированном. Файл представляет собой дамп из SSIS/SQL Server, который считывается машиной Linux для обработки.

  • Существуют ли какие-либо переключатели в пределах vi, less, more и т.д.

  • В дополнение к просмотру строк, мне нужно знать, каков тип конца строки (CRLF или LF). Как это узнать?

Ответ 1

Вы можете использовать утилиту file, чтобы дать вам указание типа окончаний строки.

Unix:

$ file testfile1.txt
testfile.txt: ASCII text

"DOS" :

$ file testfile2.txt
testfile2.txt: ASCII text, with CRLF line terminators

Для преобразования из "DOS" в Unix:

$ dos2unix testfile2.txt

Для преобразования из Unix в "DOS" :

$ unix2dos testfile1.txt

Преобразование уже преобразованного файла не имеет никакого эффекта, поэтому безопасно запускаться вслепую (т.е. без предварительного тестирования формата), хотя обычно применяются обычные отказы.

Ответ 2

В vi...

:set list, чтобы увидеть окончания строки.

:set nolist, чтобы вернуться к нормальной работе.

Хотя я не думаю, что вы можете видеть \n или \r\n в vi, вы можете увидеть, какой тип файла он (UNIX, DOS и т.д.), чтобы определить, какие строки заканчиваются..

:set ff

В качестве альтернативы, от bash вы можете использовать od -t c <filename> или просто od -c <filename> для отображения возвратов.

Ответ 3

В оболочке bash попробуйте cat -v <filename>. Это должно отображать возврат каретки для файлов Windows.

(Это работало для меня в rxvt через Cygwin в Windows XP).

Примечание редактора: cat -v отображает символы \r (CR). как ^M. Таким образом, последовательности конца строки \r\n будут отображаться как ^M в конце каждой выходной строки. cat -e дополнительно визуализирует \n, а именно как $. (cat -et дополнительно визуализирует символы табуляции как ^I.)

Ответ 4

Ubuntu 14.04:

простой cat -e <filename> работает просто отлично.

Здесь отображаются окончания строк Unix (\n или LF) как $ и окончания строки Windows (\r\n или CRLF) как ^M$.

Ответ 5

Чтобы показать CR как ^M при меньшем использовании less -u или введите - u, когда меньше открыта.

man less говорит:

-u or --underline-special

      Causes backspaces and carriage returns to be treated  as  print-
      able  characters;  that  is,  they are sent to the terminal when
      they appear in the input.

Ответ 6

Вы можете использовать xxd для отображения шестнадцатеричного дампа файла и поискать для символов "0d0a" или "0a".

Вы можете использовать cat -v <filename>, как предлагает @warriorpostman.

Ответ 7

Попробуйте "файл -k"

Краткая версия: file -k somefile.txt скажет вам.

  • Он будет выводить with CRLF line endings для with CRLF line endings DOS/Windows.
  • Он будет выводиться with LF line endings для MAC-концов.
  • А для Linux/Unix строка "CR" будет просто выводить text. (Таким образом, если в нем явно не упоминается какой-либо вид line endings то это неявно означает: "окончания строки CR".)

Длинную версию смотрите ниже.


Реальное приложение: кодировка сертификатов

Я иногда должен проверить это для файлов сертификата PEM.

Проблема с обычным file заключается в следующем: иногда он пытается быть слишком умным/слишком конкретным.

Давайте попробуем небольшой тест: у меня есть несколько файлов. И один из этих файлов имеет разные окончания строки. Который из?

(Кстати: вот так выглядит один из моих типичных каталогов "работы с сертификатами".)

Давайте попробуем обычный file:

$ file -- *
0.example.end.cer:         PEM certificate
0.example.end.key:         PEM RSA private key
1.example.int.cer:         PEM certificate
2.example.root.cer:        PEM certificate
example.opensslconfig.ini: ASCII text
example.req:               PEM certificate request

Да. Это не говорит мне об окончании строки. И я уже знал, что это были сертификаты. Мне не нужно было "файл", чтобы сказать мне это.

Что еще можно попробовать?

Вы можете попробовать dos2unix с переключателем --info следующим образом:

$ dos2unix --info -- *
  37       0       0  no_bom    text    0.example.end.cer
   0      27       0  no_bom    text    0.example.end.key
   0      28       0  no_bom    text    1.example.int.cer
   0      25       0  no_bom    text    2.example.root.cer
   0      35       0  no_bom    text    example.opensslconfig.ini
   0      19       0  no_bom    text    example.req

Так что это говорит вам о том, что: yup, "0.example.end.cer" должен быть нечетным человеком. Но что за концы строк? Вы знаете формат вывода dos2unix наизусть? (Я не.)

Но, к счастью, там --keep-going (или -k для краткости) вариант в file:

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text, with CRLF line terminators\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data

Отлично! Теперь мы знаем, что наш нечетный файл имеет окончания строки DOS (CRLF). (И другие файлы имеют окончание строк Unix (LF). Это не явно в этом выводе. Это неявное. Это просто способ, которым file ожидает, что "обычный" текстовый файл будет.)

(Если вы хотите поделиться моей мнемоникой: "L" для "Linux" и "LF".)

Теперь давайте преобразуем преступника и попробуйте снова:

$ dos2unix -- 0.example.end.cer

$ file --keep-going -- *
0.example.end.cer:         PEM certificate\012- , ASCII text\012- data
0.example.end.key:         PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer:         PEM certificate\012- , ASCII text\012- data
2.example.root.cer:        PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req:               PEM certificate request\012- , ASCII text\012- data  

Хорошо. Теперь все сертификаты имеют окончания строки Unix.

дальнейшее чтение

Ответ 8

Вы можете использовать команду todos filename для преобразования в конец DOS и fromdos filename для преобразования в конец строки UNIX. Чтобы установить пакет на Ubuntu, введите sudo apt-get install tofrodos.

Ответ 9

Вы можете использовать vim -b filename для редактирования файла в двоичном режиме, в котором будут отображаться символы ^ M для возврата каретки, а новая строка указывает на присутствие LF, указывая окончания строк Windows CRLF. Под LF я имею в виду \n, а CR CR означает \r. Обратите внимание, что при использовании опции -b файл всегда будет редактироваться в режиме UNIX по умолчанию, как указано в [unix] в строке состояния, что означает, что если вы добавите новые строки, они будут заканчиваться LF, а не CRLF. Если вы используете обычный vim без -b в файле с окончанием строки CRLF, вы должны увидеть [dos], показанный в строке состояния, и вставленные строки будут иметь CRLF в конце строки. Документация vim для настройки fileformats объясняет сложности.

Кроме того, у меня недостаточно точек для комментариев к сообщению Notepad ++, но если вы используете Notepad ++ в Windows, используйте меню View/Show Symbol/Show End of Line для отображения CR и LF. В этом случае отображается LF, тогда как для vim LF обозначается новой строкой.

Ответ 10

Я вывожу свой вывод в текстовый файл. Затем я открою его в блокноте ++, затем нажмите кнопку "Показать все символы". Не очень элегантный, но он работает.

Ответ 11

Вы также можете использовать:

$ cat -v filename

который покажет ^M в конце, если Windows конец строки. Чтобы сделать что-то полезное в скрипте, вы можете проверить количество строк с таким окончанием строки, например, используйте следующее для подсчета строк. Обратная косая черта необходима для grep потому что ^ означает начало строки в регулярном выражении. Если существует вероятность того, что окончания строк смешиваются в файле, вы можете сравнить общее количество строк с окончаниями строк в Windows и убедиться, что они совпадают.

 $ countOfCR=$(cat -v filename | grep '\^M' | wc -l)

Затем используйте переменную countOfCR для выполнения некоторой логики.