Команде Linux (например, cat) читать указанное количество символов

Есть ли в linux команда типа cat, которая может возвращать указанное количество символов из файла?

Например, у меня есть текстовый файл, например:

Hello world
this is the second line
this is the third line

И я хочу что-то, что вернет первые 5 символов, которые будут "привет".

спасибо

Ответ 1

head тоже работает:

head -c 100 file  # returns the first 100 bytes in the file

.. будет извлекать первые 100 байт и возвращать их.

Что приятно использовать head для этого, так это то, что синтаксис для tail соответствует:

tail -c 100 file  # returns the last 100 bytes in the file

Ответ 2

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

Например,

dd skip=1234 count=5 bs=1

будет копировать байты с 1235 по 1239 с его ввода на его вывод и отбрасывать остальные.

Чтобы просто получить первые пять байтов со стандартного ввода, выполните:

dd count=5 bs=1

Обратите внимание, что если вы хотите указать имя входного файла, dd имеет старомодный синтаксический анализ аргументов, поэтому вы должны:

dd count=5 bs=1 if=filename

Обратите внимание также, что dd подробно объявляет, что он сделал, поэтому, чтобы отбросить это, выполните:

dd count=5 bs=1 2>&-

или

dd count=5 bs=1 2>/dev/null

Ответ 3

head:

Имя

head - выводит первую часть файлов

Описание

head [ OPTION]... [ FILE]...

Описание

Распечатайте первые 10 строк каждого файла FILE на стандартный вывод. С более чем одним ФАЙЛом перед каждым заголовок передается имя файла. Без FILE или когда FILE - -, прочитайте стандартный ввод.

Обязательные аргументы для длинных опций также обязательны для коротких опций.
-c, - bytes= [-] N напечатайте первые N байтов каждого файла; с ведущим "-", напечатайте все, кроме последних N байтов каждого файла

Ответ 4

head -Line_number file_name | tail -1 |cut -c Num_of_chars

этот script дает точное количество символов из конкретной строки и местоположения, например:

head -5 tst.txt | tail -1 |cut -c 5-8

дает символы в строке 5 и символы 5-8 строки 5,

Примечание: tail -1 используется для выбора последней строки, отображаемой головкой.

Ответ 5

голова или хвост могут это сделать:

head -c X

Распечатывает первые X байты (не обязательно символы, если это файл UTF-16) файла. tail сделает то же самое, за исключением последних X байтов.

Это (и разрез) переносимы.

Ответ 6

вы также можете выровнять строку, а затем разрезать ее, как, например:

grep 'text' filename | cut -c 1-5

Ответ 7

Я знаю, что ответ отвечает на вопрос, заданный 6 лет назад...

Но я искал что-то подобное в течение нескольких часов, а затем узнал, что: cut -c делает именно это, с добавленным бонусом, что вы также можете указать смещение.

cut -c 1-5 вернет Hello и cut -c 7-11 вернет мир, Нет необходимости в какой-либо другой команде

Ответ 8

Несмотря на то, что этот ответ был принят/принят много лет назад, принятый в настоящее время ответ верен только для однобайтовых кодировок, таких как iso-8859-1, или для однобайтовых подмножеств многобайтовых наборов символов ( как латинские символы в UTF-8). Даже использование многобайтовых сплайсов вместо этого будет работать только для фиксированных многобайтовых кодировок, таких как UTF-16. Учитывая, что теперь UTF-8 находится на пути к универсальному стандарту и при просмотре этого списка языков по количеству носителей языка и этот список из 30 лучших языков с использованием собственного/вторичного использования, важно указать простой переменный байтовый символ (не байт)), используя cut -c и tr/sed с характерными классами.

Сравните следующее, что вдвойне не удается из-за двух распространенных латинских ошибок/презумпций относительно проблемы с байтами и символами (один из них - head vs. cut, другой - [a-z][A-Z] vs. [:upper:][:lower:]).

$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$     head -c 1 | \
$     sed -e 's/[A-Z]/[a-z]/g'
[[unreadable binary mess, or nothing if the terminal filtered it]]

к этому (примечание: это отлично работало на FreeBSD, но оба cut и tr на GNU/Linux по-прежнему искалечили греческий язык в UTF-8):

$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$     cut -c 1 | \
$     tr '[:upper:]' '[:lower:]'
π

Еще один более поздний ответ уже предложил "вырезать", но только из-за побочной проблемы, что его можно использовать для указания произвольных смещений, а не из-за проблемы, непосредственно связанной с символом и байтами.

Если ваш cut не обрабатывает -c с кодировками с переменным байтом правильно, для "первых X символов" (замените X на ваш номер) вы можете попробовать:

  • sed -E -e '1 s/^(.{X}).*$/\1/' -e q - который ограничен первой строкой, хотя
  • head -n 1 | grep -E -o '^.{X}' - который ограничен первой строкой и объединяет две команды, хотя
  • dd - что уже было предложено в других ответах, но действительно громоздко
  • Сложный sed script с скользящим оконным буфером для обработки символов, распределенных по нескольким строкам, но это, вероятно, более громоздко/хрупко, чем просто использовать что-то вроде dd

Если ваш tr не обрабатывает символьные классы с кодировками с переменным байтом, вы можете попробовать:

  • sed -E -e 's/[[:upper:]]/\L&/g (специфичный для GNU)

Ответ 9

Вот простой script, который завершается с использованием подхода dd, упомянутого здесь:

extract_chars.sh

#!/usr/bin/env bash

function show_help()
{
  IT="
extracts characters X to Y from stdin or FILE
usage: X Y {FILE}

e.g. 

2 10 /tmp/it     => extract chars 2-10 from /tmp/it
EOF
  "
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$1" ]
then
  show_help
fi

FROM=$1
TO=$2
COUNT=`expr $TO - $FROM + 1`

if [ -z "$3" ]
then
  dd skip=$FROM count=$COUNT bs=1 2>/dev/null
else
  dd skip=$FROM count=$COUNT bs=1 if=$3 2>/dev/null 
fi