получение первых [x] символов для строки из канала

<p>если у меня действительно длинный вывод команды (в одну строку), но я знаю, что мне нужны только первые [x] (скажем, 8) символы вывода, какой самый простой способ получить это? здесь нет разделителей.</p>

<p>одним из способов является использование <code>cut</code>:</p><pre><code> command | cut -c1-8 </code></pre><p>это даст вам первые 8 символов каждой строки вывода. поскольку <code>cut</code> является частью posix, скорее всего, это будет в большинстве unices.</p>

<p>это еще несколько способов получить только первые 8 символов.</p><pre><code>command | head -c8 command | awk '{print substr($0,1,8);exit}' command | sed 's/^(........)./1/;q' и если у вас есть башvar=$(command) echo ${var:0:8} 

еще одно линейное решение с использованием <a href="http://pubs.opengroup.org/onlinepubs/9699919799/utilities/v3_chap02.html#tag_18_06_02"><strong> расширения параметра </strong> <blockquote> echo ${word:0:x}</code></p> </blockquote><pre><code>eg: word="hello world" echo ${word:0:3} or echo ${word::3} o/p: hel eg.2: word="hello world" echo ${word:1:3} o/p: ell 

если у вас достаточно продвинутая оболочка (например, в bash будет работать следующее, но вы не уверены в dash), вы можете сделать следующее:_read -n8 -d$'\0' -r <(command) </code>\_</pre><p>после выполнения <code>read ... <(command)</code> ваши символы будут находиться в переменной shell <code>reply</code>. введите \_<code>help read</code>\_, чтобы узнать о других параметрах.</p><p>объяснение: аргумент \_<code>-n8</code>\_ для <code>read</code> говорит о том, что нам нужно до 8 символов. \_<code>-d$'0'_ говорит, что прочитано до нуля, а не до новой строки. таким образом, чтение будет продолжаться в течение 8 символов, даже если один из более ранних символов является новой строкой (но не если это нулевое значение). альтернативой _-n8 -d$'\0'</code>\_ является использование \_<code>-n8</code>\_, которое читает ровно 8 символов или до тех пор, пока stdin не достигнет eof. никакой разделитель не приветствуется. это, вероятно, лучше соответствует вашим потребностям, но я не знаю, сколько оболочек имеет чтение, которое чтит \_<code>-n</code>\_, в отличие от почитания \_<code>-n</code>\_ и \_<code>-d</code>\_. продолжая объяснение: \_<code>-r</code>\_ говорит, что игнорировать \_<code>\</code>\_- экранирует, так что, например, мы рассматриваем \_<code>\\</code>\_ как два символа, а не как один \_<code>\</code>\_.</p><p>наконец, мы делаем <code>read ... <(command)</code>, а не \_<code>command | read ...</code>\_, потому что во второй форме чтение выполняется в подоболочке, которая затем немедленно завершается, теряя информацию, которую вы только что прочитали.</p><p>другой вариант - выполнить всю обработку внутри subshell. например:</p><pre>\_<code>$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "reply=<%s>\n" "$reply"; } reply=<abcdefgh> _

это портативный:a="$(command)" # get the output of the command. b="????" # as many ? as characters are needed. echo ${a%"${a#${b}}"} # select that many chars from $a </code></pre><p>для построения строки переменной длины символов <a href="https://stackoverflow.com/q/3211891/2350426">свой вопрос здесь</a> .</p>

<p>у меня была эта проблема при создании файлов контрольной суммы вручную в репозитории maven. к несчастью <code>cut -c</code> всегда печатает новую строку в конце вывода. для подавления того, что я использую <code>xxd</code>:</p><pre><code>command | xxd -l$bytes | xxd -r выводит ровно $bytes</code> байт, если только вывод <code>command</code> не будет короче, то именно этот вывод.</p>