Вывести результат функции отметки времени на одну строку перед строкой - PullRequest
0 голосов
/ 14 декабря 2018

Внизу приведены некоторые примеры данных JSON, к которым я хотел бы добавить метки времени.т.е. "time": "1544785866.176123088" Временные метки должны быть уникальными на каждой итерации и должны появляться в строке выше «bladesetName».К сожалению, то, что я до сих пор не работает.После распечатки времени в файл в нужных местах я собирался добавить 1 нс к каждой записи.Есть ли лучший способ сделать это?

timestamp() {
    date +%s.%N
}

awk "/bladesetName/{ print '"time" "$(timestamp)"' }1" volumes3.json

Это выдает ошибку

awk: /bladesetName/{ print 'time 1544786158.644385726' }1
awk:                       ^ invalid char ''' in expression

.

{
"pasxml": {
    "@version": "6.0.0",
    "system": {
        "name": "example1",
        "IPV4": "0.0.0.0",
        "alertLevel": "critical",
        "state": "online"
    },
    "volumes": {
        "volume": [
            {
                "@id": "1",
                "name": "/",
                "bladesetName": {
                    "@id": "1",
                    "#text": "Set-1"
                },
                "state": "Online",
                "raid": "Object RAID6+",
                "director": "Shelf-001,1",
                "volservice": "0x0400000000000004(FM)",
                "objectId": "I-xD0200000000000004-xG7ee84b0c-xU00004a75726a656e",
                "recoveryPriority": "1",
                "efsaMode": "retry",
                "spaceUsedGB": "0",
                "spaceAvailableGB": "693903.38",
                "hardQuotaGB": "0.52",
                "softQuotaGB": "0.52",
                "userQuotaPolicy": {
                    "@inherit": "0",
                    "#text": "disabled"
                },
                "stats": null
            },
            {
                "@id": "8",
                "name": "/datacentre/archvol/pan101",
                "bladesetName": {
                    "@id": "1",
                    "#text": "Set-1"
                },
                "alertLevel": "critical",
                "state": "Online",
                "raid": "Object RAID6+",
                "director": "Shelf-008,1",
                "volservice": "0x04000000000000ec(FM)",
                "objectId": "I-xD02000000000000ec-xG5c7aef6f-xU00004a75726a656e",
                "recoveryPriority": "50",
                "efsaMode": "retry",
                "spaceUsedGB": "117000.09",
                "spaceAvailableGB": "693903.38",
                "hardQuotaGB": "117000.00",
                "softQuotaGB": "90000.00",
                "userQuotaPolicy": {
                    "@inherit": "1",
                    "#text": "disabled"
                },
                "stats": null
            },

1 Ответ

0 голосов
/ 14 декабря 2018

Вот один подход, который использует :

def addnow: 
  . as $in
  | to_entries
  | (map(.key)|index("bladesetName")) as $i
  | if $i 
    then .[0:$i]+[{key:"time",value:now}]+.[$i:] | from_entries
    else $in 
    end ;

walk(if type=="object" then addnow else . end)

Если вы действительно хотите, чтобы время было в виде строки, просто добавьте tostring, как в (now|tostring)

Если у вашего jq нет walk, то сейчас самое время обновить;в противном случае просто скопируйте и вставьте его def, который можно легко найти в Интернете, например, путем поиска в Google: jq «def walk»

...