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

<p>есть ли такая команда, как <code>cat</code> в linux, которая может возвратить указанное количество символов из файла?</p><p>например, у меня есть текстовый файл как:</p><pre><code>hello world this is the second line this is the third line </code></pre><p>и я хочу что-то, что вернет первые 5 символов, что будет «привет».</p><p>спасибо</p>

<p><code>head</code> тоже работает:</p><pre><code>head -c 100 file # returns the first 100 bytes in the file </code></pre><p>... извлечет первые 100 байтов и вернет их. </p><p>что хорошо в использовании <code>head</code>, так это то, что синтаксис для <code>tail</code> совпадает:</p><pre><code>tail -c 100 file # returns the last 100 bytes in the file </code></pre>

<p>вы можете использовать dd для извлечения произвольных кусков байтов. </p><p>например,</p><pre><code>dd skip=1234 count=5 bs=1 </code></pre><p>скопирует байты с 1235 по 1239 со своего входа на свой выход и отбросит остальные.</p><p>чтобы получить первые пять байтов из стандартного ввода, выполните:</p><pre><code>dd count=5 bs=1 </code></pre><p>обратите внимание, что если вы хотите указать имя входного файла, dd использует старомодный синтаксический анализ аргументов, поэтому вы должны сделать:</p><pre><code>dd count=5 bs=1 if=filename </code></pre><p>обратите внимание, что dd многословно объявляет, что он сделал, поэтому, чтобы отбросить это, сделайте:</p><pre><code>dd count=5 bs=1 2>&- </code></pre><p>или же</p><pre><code>dd count=5 bs=1 2>/dev/null </code></pre>

<p> <a href="http://linux.die.net/man/1/head">голова</a> :</p><h2>название</h2><p>head - вывод первой части файлов</p><h2>конспект</h2><p><b>голова</b> [<i>вариант</i>] ... [<i>файл</i>] ...</p><h2>описание</h2><p><p>выведите первые 10 строк каждого файла на стандартный вывод. с более чем одним файлом, перед каждым заголовком указывается имя файла. без файла, или когда файл - -, читать стандартный ввод . <p>обязательные аргументы для длинных опций обязательны и для коротких опций . <br/> <b>-с</b>, <b>--bytes</b>знак равно<i>[-] n</i> печатать первые n байтов каждого файла; с начальным '-', выведите все, кроме последних n байтов каждого файла</p>

<p>голова или хвост могут сделать это также:</p><blockquote> head -c x </blockquote><p>печатает первые x байтов (не обязательно символы, если это файл utf-16) файла. tail сделает то же самое, за исключением последних x байтов.</p><p>это (и вырезать) являются портативными.</p>

<pre><code>head -line\_number file\_name | tail -1 |cut -c num\_of\_chars </code></pre><p>этот скрипт дает точное количество символов из конкретной строки и местоположения, например: </p><pre><code>head -5 tst.txt | tail -1 |cut -c 5-8 </code></pre><p>дает символы в строке 5 и символы 5-8 в строке 5, </p><p><strong> примечание </strong>: <code>tail -1</code> используется для выбора последней строки, отображаемой головой.</p>

<p>я знаю, что ответ на вопрос, заданный 6 лет назад ...</p><p>но я искал нечто подобное в течение нескольких часов, а затем обнаружил, что: <strong> cut -c </strong>делает именно это, с дополнительным бонусом, который вы также можете указать смещение.</p><p><strong> cut -c 1-5 </strong>вернется<strong> hello </strong>и<strong> cut -c 7-11 </strong>вернется<strong> world </strong>. нет необходимости в какой-либо другой команде</p>

<p>вы также можете извлечь строку, а затем обрезать ее, например:</p><p>grep 'text' имя файла | cut -c 1-5</p>

<p>несмотря на то, что на этот вопрос был дан ответ/принят несколько лет назад, принятый в настоящее время ответ является правильным только для однобайтовых кодировок символов, таких как iso-8859-1, или для однобайтовых подмножеств наборов переменных байтов (например, латинских символов). в пределах utf-8). даже использование многобайтовых сплайсов вместо этого будет работать только для фиксированных многобайтовых кодировок, таких как utf-16. учитывая, что теперь utf-8 находится на пути к тому, чтобы стать универсальным стандартом, и, если посмотреть на <a href="https://en.wikipedia.org/wiki/list\_of\_languages\_by\_number\_of\_native\_speakers#nationalencyklopedin">этот список языков по количеству носителей языка</a> и <a href="http://www.vistawide.com/languages/top\_30\_languages.htm">этот список из 30 лучших языков по родному/вторичному использованию</a> , важно отметить простую, дружественную к символам (не основанную на байтах) технику с переменными байтами, использующую <code>cut -c</code> и <code>tr</code>/<code>sed</code> с символьными классами.</p><p>сравните следующее, что вдвойне не удается из-за двух распространенных латинско-центричных ошибок/предположений относительно проблемы байтов и символов (одна <code>head</code> против <code>cut</code>, другая <code>[a-z][a-z]</code> против <code>[:upper:][:lower:]</code>):</p><pre><code>$ 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:]' π </code></pre><blockquote> <p>в другом, более недавнем ответе уже предлагалось «вырезать», но только из-за побочной проблемы, которую он может использовать для указания произвольных смещений, а не из-за прямо связанной проблемы символа и байтов.</p> </blockquote><p>если ваша <code>cut</code> не обрабатывает <code>-c</code> с переменными байтовыми кодировками правильно, для «первых <code>x</code> символов» (замените <code>x</code> вашим числом) вы можете попробовать:</p><ul> <li><code>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) 

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