it-swarm-ru.tech

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

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

67
xenoterracide

Одним из способов является использование cut:

 command | cut -c1-8

Это даст вам первые 8 символов каждой строки вывода. Поскольку cut является частью POSIX, скорее всего, это будет в большинстве Unices.

95
Steven D

Это еще несколько способов получить только первые 8 символов.

command | head -c8

command | awk '{print substr($0,1,8);exit}' 

command | sed 's/^\(........\).*/\1/;q'

И если у вас есть Баш

var=$(command)
echo ${var:0:8}
26
user1606

Еще одно линейное решение с использованием расширения параметра

echo ${Word:0:x}

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
2
Prabhat Kumar Singh

Если у вас достаточно продвинутая оболочка (например, в Bash будет работать следующее, но вы не уверены в dash), вы можете сделать следующее:

_read -n8 -d$'\0' -r <(command)
_

После выполнения read ... <(command) ваши символы будут находиться в переменной Shell REPLY. Введите _help read_, чтобы узнать о других параметрах.

Объяснение: аргумент _-n8_ для read говорит о том, что нам нужно до 8 символов. _-d$'\0'_ говорит, что прочитано до нуля, а не до новой строки. Таким образом, чтение будет продолжаться в течение 8 символов, даже если один из более ранних символов является новой строкой (но не если это нулевое значение). Альтернативой _-n8 -d$'\0'_ является использование _-N8_, которое читает ровно 8 символов или до тех пор, пока stdin не достигнет EOF. Никакой разделитель не приветствуется. Это, вероятно, лучше соответствует вашим потребностям, но я не знаю, сколько оболочек имеет чтение, которое чтит _-N_, в отличие от почитания _-n_ и _-d_. Продолжая объяснение: _-r_ говорит, что игнорировать _\_- экранирует, так что, например, мы рассматриваем _\\_ как два символа, а не как один _\_.

Наконец, мы делаем read ... <(command), а не _command | read ..._, потому что во второй форме чтение выполняется в подоболочке, которая затем немедленно завершается, теряя информацию, которую вы только что прочитали.

Другой вариант - выполнить всю обработку внутри subshell. Например:

_$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
_
2
dubiousjim

Это портативный:

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

Для построения строки переменной длины символов свой вопрос здесь .

1
user79743

У меня была эта проблема при создании файлов контрольной суммы вручную в репозитории maven. К несчастью cut -c всегда печатает новую строку в конце вывода. Для подавления того, что я использую xxd:

command | xxd -l$BYTES | xxd -r

Выводит ровно $BYTES байт, если только вывод command не будет короче, то именно этот вывод.

0
Krzysztof Jabłoński