У меня есть текстовый файл, который я выводил в переменную в моем сценарии оболочки. Однако мне нужны только первые 50 символов.
Я пытался использовать, cat ${filename} cut -c1-50
но я получаю гораздо больше, чем первые 50 символов? Это может быть связано с cut
поиском строк (не уверен на 100%), хотя этот текстовый файл может быть одной длинной строкой - это действительно зависит.
Есть ли какая-нибудь утилита, в которую я могу обратиться, чтобы получить первые X символов из cat
команды?
|
?cat ${filename} | cut -c1-50
Ответы:
Это возвращает первые 50 байтов.
Имейте в виду, что команда не всегда выполняется одинаково на всех ОС. В Linux и macOS это ведет себя так. В Solaris (11) вам нужно использовать версию gnu в / usr / gnu / bin /
источник
-c
выбора. Я бы пошел на дд (1) вместо этого.GNU coreutils 5.97
) делает.-c
допустимую опцию, поэтому он определенно зависит от вашей локальной среды. unix.com/man-page/posix/1/headВаша
cut
команда работает, если вы используете канал для передачи данных:Или, избегая бесполезного использования кошки и делая его немного более безопасным:
Обратите внимание, что команды выше будут печатать первые 50 символов (или байтов, в зависимости от вашей
cut
реализации) каждой строки ввода . Он должен делать то, что вы ожидаете, если, как вы говорите, ваш файл представляет собой одну огромную строку.источник
Это возвращает первые 50 байтов.
источник
status=none
флага.2>/dev/null
Вместо этого используйте (и правильно цитируйте):dd if="$filename" bs=1 count=50 2>/dev/null
(несмотря на это, рассмотрите возможность использованияbs=50 count=1
для уменьшения количества задействованных системных вызовов).status=none
при использовании Ubuntu 14.04, coreutils 8.21, но вы можете использовать его,2>/dev/null
если используете более раннюю версию.read()
из 50 байтов. Если,file
например, это канал, и в то время доступно меньше символов, будет возвращено меньше байтов. Чтобы иметь эквивалентhead -c50
, вам нужно использовать специфический для GNUiflag=fullblock
.Большинство ответов до сих пор предполагают, что 1 байт = 1 символ, что может быть не так, если вы используете не ASCII-локаль.
Немного более надежный способ сделать это:
Обратите внимание, что это предполагает:
ksh93
,bash
(или в последнее времяzsh
илиmksh
(хотя только многобайтовой кодировка поддерживаетсяmksh
в UTF-8 и только после того, какset -o utf8-mode
)) и версия ,head
которая поддерживает-c
(большинство из них в настоящее время, но не строго стандарт).locale charmap
иfile -- "$filename"
проверьте это); если нет, установите его с помощью ie.LC_ALL=en_US.UTF-8
)head
, предполагая наихудший вариант UTF-8, где все символы закодированы не более чем в 4 байта. Это должно охватывать большинство случаев, о которых я могу думать.источник
head
или другой его реализации, в которой добавлена опция nōn-standard-c
. Но вам уже нужна GNU bash. (Примечание:mksh
режим UTF-8 мог бы сделать это для файлов в кодировке UTF-8.) Я бы спросил у OP, требуют ли они октеты или многобайтовые символы, просто «символы» - это неопределенный термин.$filename
или$testString
не содержит пустых символов новой строки, подстановочных знаков или начинается с-
.${var:offset:length}
Конструкция вы используете здесь на самом деле происходит отksh93
и поддерживается последними версиямиzsh
(zsh
имеет свой собственный$testString[1,50]
). Вы нуждаетесь${testString:0:50}
вksh93
иzsh
однако.Другой вариант (для первой строки в файле)
источник
read
аecho
? Илиbash expansion
?grep
(regexp), и да, использование здесь оболочки (подсказка: первая строка может быть большой). (Это, как говорится, bashism также не в POSIX, но большинство оболочек реализуют это.)1. Для файлов ASCII, сделайте, как @DisplayName говорит:
например, распечатает первые 50 символов файла file.txt.
2. Для двоичных данных
hexdump
распечатайте их в виде шестнадцатеричных символов:например, распечатает первые 50 байтов файла file.bin.
Обратите внимание, что без параметра
-v
verbosehexdump
вместо повторяющихся строк будет использоваться звездочка (*
). Смотрите здесь: https://superuser.com/questions/494245/what-does-an-asterisk-mean-in-hexdump-output/494613#494613 .источник
Вы можете использовать sed для этого, что довольно легко решит проблему
источник
sed -n -e '1s/^\(.\{50\}\).*/\1/p' ${filename}