Данные в / proc
вообще не обновляются. Генерируется по запросу.
Когда вы читаете из / proc
(или вообще из любого файла), вы вызываете ядро. Если вы читаете «настоящий» файл, тогда ядро (при условии кэширования, разрешений и т. Д.) Будет проходить через файловую систему и извлекать запрошенные вами данные. Если вы читаете «файл» / proc
, ядро сгенерирует соответствующие данные на лету.
Этот метод стал довольно популярным и теперь широко используется в различных областях файловой системы.Например, виртуальная файловая система / sys
очень похожа на / proc
с архитектурной точки зрения, хотя ее содержимое полностью отличается. В современных системах вы можете обнаружить, что / dev
также виртуальная файловая система , так как в противном случае довольно болезненно хранить файлы в / dev
до -соответствие аппаратным реалиям. Некоторые службы пользовательского пространства предоставляют свои собственные виртуальные файловые системы через FUSE .
Пример файла JSON:
[
{
"host": "myhost",
"schema": "AAAAA",
"lunch": "sandwich"
},
{
"host": "myotherhost",
"schema": "QQQQQ",
"lunch": "pizza"
}
]
Мы хотели бы заменить каждый schema
, то есть AAAAA
, на BBBBB
. Мы можем сделать это с помощьюjq
:
$ jq 'map(if.schema == "AAAAA" then.schema = "BBBBB" else. end)' file.json
[
{
"host": "myhost",
"schema": "BBBBB",
"lunch": "sandwhich"
},
{
"host": "myotherhost",
"schema": "QQQQQ",
"lunch": "pizza"
}
]
Если не имеет значения, какой была старая схема:
$ jq 'map(.schema = "BBBBB")' file.json
[
{
"host": "myhost",
"schema": "BBBBB",
"lunch": "sandwhich"
},
{
"host": "myotherhost",
"schema": "BBBBB",
"lunch": "pizza"
}
]
Поскольку jq
является правильным парсером JSON, это будет работать, даже если файл будет представлен в более компактной форме, например, в виде одной строки
[{"host":"myhost","schema":"AAAAA","lunch":"sandwhich"},{"host":"myotherhost","schema":"QQQQQ","lunch":"pizza"}]
Для актуальной проблемы(в комментариях ), которая состоит в том, чтобы найти элемент в .rules.behavior[]
, который имеет ключ .name
со значением mPulse
, а затем изменить этот элемент .options.apiKey
в другое значение:
jq '.rules.behaviors = [.rules.behaviors[]|select(.name == "mPulse").options.apiKey = "XXX"]' file.json
То есть переписать массив .rules.behaviour
таким образом, чтобы элемент, чей .name
ключ равен mPulse
, получил новый .options.apiKey
.
Для этого вам не нужны grep
, awk
и sed
; awk
может выполнять все задачи (не проверено):
awk '/schema/ {$3 = "BBBBB"} 1' test.json > /tmp/$$ && mv /tmp/$$ test.json
Пожалуйста, попробуйте и сообщите об этом.
Несколько оптимизаций, не последней из которых является отказ от «бесполезного использования cat
». Вам не нужно cat file | grep pattern
; можно просто grep pattern file
. А так как вы grep
пингуетесь в awk
, это тоже можно упростить:
currentSchema="$( cat test.json | grep schema | awk '{print $3}' )"
становится
currentSchema="$( awk '/schema/ {print $3}' test.json )"
Теперь о вашем sed
скрипте. Вы используете сильные кавычки('
)вокруг вашей команды sed, что означает, что ваши переменные оболочки не будут проанализированы. Вам нужно использовать Weak Quotes ("
), чтобы это работало:
currentSchema="$( awk '/schema/ {print $3}' test.json )"
sed --in-place "s/$currentSchema/BBBBB/" test.json