Если у меня действительно длинный вывод команды (в одну строку), но я знаю, что мне нужны только первые [x] (скажем, 8) символы вывода, какой самый простой способ получить это? Здесь нет разделителей.
command-line
shell
text-processing
xenoterracide
источник
источник
Ответы:
Одним из способов является использование
cut
:Это даст вам первые 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 | sed 's/\(.\{8\}\).*/\1/'
или если ваш SED поддерживает его:command | sed -r 's/(.{8}).*/\1/'
; В противном случае +1head -c
учитываются байты , а не символы. Аналогично, среди основных реализаций Awk только GNU awk правильно обрабатывает многобайтовые символы, а FreeBSD Awk и Mawk - нет.Если у вас достаточно продвинутая оболочка (например, в Bash будет работать следующее, но вы не уверены в dash), вы можете сделать следующее:
После выполнения
read ... <(command)
ваши символы будут находиться в переменной оболочкиREPLY
. Введите,help read
чтобы узнать о других вариантах.Объяснение:
-n8
аргумент toread
говорит, что мы хотим до 8 символов.-d$'\0'
Говорит чтение до нуля, а не перевод строки. Таким образом, чтение будет продолжаться в течение 8 символов, даже если один из более ранних символов является новой строкой (но не если это нулевое значение). Альтернативой-n8 -d$'\0'
является использование-N8
, которое читает ровно 8 символов или до тех пор, пока стандартный ввод не достигнет EOF. Никакой разделитель не приветствуется. Это, вероятно, лучше соответствует вашим потребностям, но я не знаю, сколько снарядов имеет чтение, которое чтит,-N
а не чтит-n
и-d
. Продолжая объяснение:-r
говорит игнорировать\
-escapes, так что, например, мы рассматриваем\\
как два символа, а не как один\
.Наконец, мы делаем,
read ... <(command)
а неcommand | read ...
потому, что во второй форме чтение выполняется в подоболочке, которая затем немедленно завершается, теряя информацию, которую вы только что прочитали.Другой вариант - выполнить всю обработку внутри subshell. Например:
источник
cut
.read -n <num>
; небольшое предостережение: Bash 3.x (все еще актуальный в ОС) по ошибке интерпретируется<num>
как число байтов и, таким образом, завершается с многобайтовыми символами; это было исправлено в Bash 4.x.Еще одно линейное решение с использованием расширения параметров
источник
x=8; echo ${word:0:$x}
вместо жесткого кодирования целого числа.Это портативный:
Для построения строки переменной длины символов здесь есть свой вопрос .
источник
У меня была эта проблема при создании файлов контрольной суммы вручную в репозитории maven. К сожалению,
cut -c
всегда выводит новую строку в конце вывода. Для подавления того, что я используюxxd
:Он выводит ровно
$BYTES
байты, еслиcommand
выходной результат не короче, то именно этот вывод.источник
cut
| tr -d '\n'