Как прочитать файл и сохранить в переменной?

Судя по вашему собственному вопросу, время записи USB вдвое меньше времени чтения при оптимальных условиях. Кажется, вы не учитываете буферы, и эти скорости чрезвычайно выгодны по сравнению с реальной производительностью устройства.

Так что попробуй:

time $ (sudo dd if=/dev/urandom of=/home/host/mnt/testfile2 bs=1M count=1000)
time $ (sudo dd if=/dev/urandom of=/home/host/mnt/testfile2 bs=1M count=1000 & sync)

И посмотрите на время второй операции.

Выполнение параллельных операций также не подходит для этой среды и приведет к ее остановке. Срок службы такого устройства при таком использовании будет коротким, такой носитель не предназначен для такого использования.

Обычно гипервизорам требуется много операций ввода-вывода, они могут постоянно сохранять образ виртуальной машины в дополнение к операциям ввода-вывода виртуальных машин, а некоторые технологии также делают регулярные моментальные снимки.

Короче говоря, вы пытаетесь использовать его не для того, для чего он был разработан, он не будет работать независимо от того, как вы пытаетесь его оптимизировать.

ПС. У меня также есть USB-ручка «той же» модели, за исключением меньшей емкости, и эта модель — очень плохой выбор, они медленные при обычном использовании. Спецификации производителя выглядят хорошо на бумаге, однако они часто представляют собой операции синхронизации с объемами данных, которые помещаются в их буфер ОЗУ.

ПС2. Вы говорите, что это устройство USB 3.1, но не сообщаете нам технологию вашего устройства.

1
17.06.2021, 18:54
3 ответа

Попробуйте:

value=$(perl -e 'print qx/cat newdata.txt/;')

Это использует " -e" для определения Perl-кода, который должен выполняться компилятором.

$ ()позволяет записывать вывод команды и назначать его переменной оболочки.

0
28.07.2021, 11:24

Это задача XY . Чтобы присвоить содержимое файла newdata.txtпеременной lines, используйте:

lines="$(cat newdata.txt)"

Но зачем вам присваивать содержимое newdata.txtпеременной?

Желаемый результат — объект JSON с полем value, значением которого является содержимое newdata.txt. Содержимое newdata.txtпредставляет собой обычный текст, а не JSON, поэтому повторение {"value", $(cat newdata.txt)}или эквивалентное {"value", $lines}в jq.не будет работать, поскольку jqожидает чтения корректного JSON.

Актуальный вопрос::как преобразовать строки обычного текста в JSON?

jqможет анализировать строки произвольного ввода в поток строк JSON, используя опции -R, --raw-input. Чтобы разобрать все входные строки сразу, используйте опции -s, --slurp. После этого ввод доступен для обычной jqпотоковой обработки, поэтому:

jq -sR '{"value",.}' newdata.txt

даст нужный объект JSON.

Отдельно стоит отметить, что echo "$(tail -n10 newdata.txt)" > newdata.txtпериодически дает сбой. У >newdata.txtесть все шансы урезать newdata.txtдо 0 байт, прежде чем tailполучит шанс прочитать свои последние 10 строк. Вы можете использовать sponge, чтобы решить эту проблему, но смотрите ниже.

Кроме того, почему echo? tail -n 10уже выводится на стандартный вывод, поэтому нет необходимости перехватывать его вывод в строке, просто чтобы echoснова вывести его на стандартный вывод.

Сочетая все это, решение в одну -строку будет:

tail -n 10 olddata.txt | tee newdata.txt | jq -sR '{"value",.}' && 
mv newdata.txt olddata.txt

bashимеет все возможности других языков программирования, такие как переменные и строки, но более продуктивно думать о нем как о потоковом процессоре, который читает со стандартного ввода и записывает на стандартный вывод.

2
28.07.2021, 11:24

Я понял. Публикую ответ, кому нужно. Я добавляю данные в файл с именем newdata.txt следующим образом:echo "$(tail -n10 newdata.txt)" > newdata.txt;

Затем я просто скопировал файл в переменную с именем value :value="$ (cat newdata.txt )"

После выполнения echo "{\"Values\":[$value]}" | jq.я получаю объект JSON.

Это работает только при наличии запятой в конце каждой строки, кроме последней строки.

Я не уверен, что это надежный и правильный способ сделать это. Но это сработало для моей проблемы.

0
28.07.2021, 11:24

Теги

Похожие вопросы