Есть ли такая команда, как cat
в Linux, которая может возвращать указанное количество символов из файла?
например, у меня есть текстовый файл вроде:
Hello world
this is the second line
this is the third line
И мне нужно что-то, что возвращало бы первые 5 символов, то есть «привет».
Спасибо
linux
command-line
pbreault
источник
источник
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
также потребляет то," world\n"
что потеряно навсегда.Ответы:
head
тоже работает:... извлечет первые 100 байтов и вернет их.
Что хорошо в использовании
head
для этого, так это то, что синтаксисtail
совпадений:Вы можете комбинировать их, чтобы получить диапазоны байтов. Например, чтобы получить вторые 100 байт из файла, прочтите первые 200 с помощью
head
и используйте tail для получения последних 100:источник
head
, затем используйте,tail
чтобы получить последние 10, например:head -c 20 file | tail -c 10
Вы можете использовать dd для извлечения произвольных блоков байтов.
Например,
скопирует байты с 1235 по 1239 со своего входа на свой выход, а остальные отбросит.
Чтобы просто получить первые пять байтов из стандартного ввода, выполните:
Обратите внимание, что если вы хотите указать имя входного файла, dd имеет старомодный синтаксический анализ аргументов, поэтому вы должны сделать:
Также обратите внимание, что dd подробно сообщает о том, что он сделал, поэтому, чтобы выбросить это, выполните:
или
источник
dd bs=1
заставляет dd читать и писать по одному символу за раз, что намного медленнее, чемhead
при большом количестве. Однако для count = 5 это не заметно.dd
, похоже, это поможет .. Ура!head -c
реализацииdd bs=5 count=1
подход сработалголова :
название
head - выводить первую часть файлов
конспект
head [ ВАРИАНТ ] ... [ ФАЙЛ ] ...
Описание
Выведите первые 10 строк каждого ФАЙЛА на стандартный вывод. При наличии нескольких ФАЙЛОВ перед каждым должен стоять заголовок с именем файла. Без ФАЙЛА или когда ФАЙЛ равен -, читать стандартный ввод.
Обязательные аргументы для длинных опций являются обязательными и для коротких опций.
-c , --bytes = [-] N распечатать первые N байтов каждого файла; с ведущим '-', вывести все, кроме последних N байтов каждого файла
источник
голова или хвост тоже могут это сделать:
Печатает первые X байтов (не обязательно символы, если это файл UTF-16) файла. tail будет делать то же самое, за исключением последних X байтов.
Это (и вырезано) портативны.
источник
этот скрипт дает точное количество символов из конкретной строки и места, например:
дает символы в строке 5 и символы с 5 по 8 в строке 5,
Примечание :
tail -1
используется для выбора последней строки, отображаемой заголовком.источник
вы также можете удалить строку, а затем вырезать ее, например:
grep 'text' имя файла | вырезать -c 1-5
источник
Я знаю, что ответ - это ответ на вопрос, заданный 6 лет назад ...
Но я несколько часов искал нечто подобное, а потом обнаружил, что: cut -c делает именно это, с дополнительным бонусом, который вы также можете указать смещение.
cut -c 1-5 вернет Hello, а cut -c 7-11 вернет world . Нет необходимости в какой-либо другой команде
источник
Несмотря на то, что на этот вопрос был дан ответ / был принят несколько лет назад, принятый в настоящее время ответ верен только для однобайтовых кодировок на символ, таких как iso-8859-1, или для однобайтовых подмножеств наборов символов с переменным байтом (например, латинские символы в UTF-8). Даже использование вместо этого многобайтовых соединений будет работать только для фиксированных многобайтовых кодировок, таких как UTF-16. Учитывая, что сейчас UTF-8 становится универсальным стандартом, и, глядя на этот список языков по количеству носителей языка и на этот список 30 лучших языков по родному / второстепенному использованию , важно указать на простой метод, дружественный к переменным байтам (не основанный на байтах), с использованием
cut -c
иtr
/sed
классов символов с ними.Сравните следующее, которое вдвойне терпит неудачу из-за двух распространенных латино-ориентированных ошибок / предположений относительно проблемы байтов и символов (один -
head
противcut
, другой -[a-z][A-Z]
против[:upper:][:lower:]
):к этому (примечание: это отлично работало на FreeBSD, но оба
cut
иtr
на GNU / Linux все еще исказили греческий язык в UTF-8 для меня):Если ваш
cut
код не работает-c
с переменными байтами правильно, для «первыхX
символов» (заменитеX
своим числом) вы можете попробовать:sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- но ограничивается первой строкойhead -n 1 | grep -E -o '^.{X}'
- который ограничен первой строкой и связывает две команды, хотяdd
- что уже предлагалось в других ответах, но действительно громоздкоsed
скрипт со скользящим оконным буфером для обработки символов, разбросанных по нескольким строкам, но это, вероятно, более громоздко / хрупко, чем просто использовать что-то вродеdd
Если вы
tr
неправильно обрабатываете классы символов с кодировками переменных байтов, вы можете попробовать:sed -E -e 's/[[:upper:]]/\L&/g
(ГНУ-специфических)источник
printf 'Πού ' | cut -c 1
просто возвращает тарабарщину ... он ведет себя как 'голова'Вот простой сценарий, использующий
dd
упомянутый здесь подход:extract_chars.sh
источник