Если у меня действительно длинный вывод команды (в одну строку), но я знаю, что мне нужны только первые [x] (скажем, 8) символы вывода, какой самый простой способ получить это? Здесь нет разделителей.
Если у меня действительно длинный вывод команды (в одну строку), но я знаю, что мне нужны только первые [x] (скажем, 8) символы вывода, какой самый простой способ получить это? Здесь нет разделителей.
Ответы:
Одним из способов является использование cut
:
command | cut -c1-8
Это даст вам первые 8 символов каждой строки вывода. Так как cut
является частью POSIX, он, вероятно, будет в большинстве Unices.
cut -c
выбирает символы; cut -b
или head -c
выбирает байты. Это имеет значение в некоторых локалях (на практике, при использовании UTF-8).
cut -c-8
будет выбирать из символов от 1 до 8.
cut
эквивалент на Windows есть?
command | dd bs=8 count=1 2>/dev/null
. Не говоря, что это короче или выше. Просто другая альтернатива.
cut
, cut -c
работает как cut -b
(то есть, он не работает должным образом для многобайтных символов).
Это еще несколько способов получить только первые 8 символов.
command | head -c8
command | awk '{print substr($0,1,8);exit}'
command | sed 's/^\(........\).*/\1/;q'
И если у вас есть Баш
var=$(command)
echo ${var:0:8}
command | sed 's/\(.\{8\}\).*/\1/'
или если ваш SED поддерживает его: command | sed -r 's/(.{8}).*/\1/'
; В противном случае +1
head -c
учитываются байты , а не символы. Аналогично, среди основных реализаций Awk только GNU awk правильно обрабатывает многобайтовые символы, а FreeBSD Awk и Mawk - нет.
Если у вас достаточно продвинутая оболочка (например, в Bash будет работать следующее, но вы не уверены в dash), вы можете сделать следующее:
read -n8 -d$'\0' -r <(command)
После выполнения read ... <(command)
ваши символы будут находиться в переменной оболочки REPLY
. Введите, help read
чтобы узнать о других вариантах.
Объяснение: -n8
аргумент to read
говорит, что мы хотим до 8 символов. -d$'\0'
Говорит чтение до нуля, а не перевод строки. Таким образом, чтение будет продолжаться в течение 8 символов, даже если один из более ранних символов является новой строкой (но не если это нулевое значение). Альтернативой -n8 -d$'\0'
является использование -N8
, которое читает ровно 8 символов или до тех пор, пока стандартный ввод не достигнет EOF. Никакой разделитель не приветствуется. Это, вероятно, лучше соответствует вашим потребностям, но я не знаю, сколько снарядов имеет чтение, которое чтит, -N
а не чтит -n
и -d
. Продолжая объяснение: -r
говорит игнорировать \
-escapes, так что, например, мы рассматриваем \\
как два символа, а не как один \
.
Наконец, мы делаем, read ... <(command)
а не command | read ...
потому, что во второй форме чтение выполняется в подоболочке, которая затем немедленно завершается, теряя информацию, которую вы только что прочитали.
Другой вариант - выполнить всю обработку внутри subshell. Например:
$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
cut
.
read -n <num>
; небольшое предостережение: Bash 3.x (все еще актуальный в ОС) по ошибке интерпретируется <num>
как число байтов и, таким образом, завершается с многобайтовыми символами; это было исправлено в Bash 4.x.
Еще одно линейное решение с использованием расширения параметров
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
x=8; echo ${word:0:$x}
вместо жесткого кодирования целого числа.
Это портативный:
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
Для построения строки переменной длины символов здесь есть свой вопрос .
У меня была эта проблема при создании файлов контрольной суммы вручную в репозитории maven. К сожалению, cut -c
всегда выводит новую строку в конце вывода. Для подавления того, что я использую xxd
:
command | xxd -l$BYTES | xxd -r
Он выводит ровно $BYTES
байты, если command
выходной результат не короче, то именно этот вывод.
cut
| tr -d '\n'