Команда Linux (например, cat), чтобы прочитать указанное количество символов - PullRequest
101 голосов
/ 20 октября 2008

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

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

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

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

спасибо

Ответы [ 9 ]

164 голосов
/ 20 октября 2008

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
43 голосов
/ 20 октября 2008

Вы можете использовать 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
11 голосов
/ 20 октября 2008

голова

Имя

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

Синопсис

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

Описание

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

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

3 голосов
/ 05 июля 2009
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 голосов
/ 20 октября 2008

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

голова -c X

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

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

2 голосов
/ 01 июля 2016

Несмотря на то, что на этот вопрос был дан ответ / принят несколько лет назад, принятый в настоящее время ответ является верным только для однобайтовых кодировок, таких как 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 голосов
/ 23 октября 2014

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

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

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

2 голосов
/ 20 октября 2008

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

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

0 голосов
/ 08 сентября 2017

Вот простой скрипт, который завершается с использованием подхода 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...