Как узнать строки в текстовом файле?
Я пытаюсь использовать что-то в 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
для выполнения некоторой логики.