it-swarm.com.ru

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

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

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

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

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

спасибо

93
pbreault

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
156
Dan

Вы можете использовать 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
42
fcw

голова :

Название

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

Конспект

голова [ВАРИАНТ] ... [ФАЙЛ] ...

Описание

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

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

11
gimel

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

head -c X

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

Это (и вырезать) являются портативными.

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

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

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

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

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

3
Vignesh

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

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

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

2
bobbyus

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

grep 'text' имя файла | cut -c 1-5

2
nkr1pt

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

Сравните следующее, что вдвойне не удается из-за двух распространенных латинско-центричных ошибок/предположений относительно проблемы байтов и символов (одна head против cut, другая [a-z][A-Z] против [: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 с буфером скользящего окна для обработки символов, распределенных по нескольким строкам, но это, вероятно, более громоздко/хрупко, чем просто использование чего-то вроде dd

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

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

Вот простой скрипт, который завершается с использованием подхода 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
0
Brad Parks