awk/sed/perl один лайнер для редагування файлу json

Ми хочемо додати наступні лінії:

export KAFKA_HEAP_OPTS="-Xmx8g -Xms8g"

і:

export KAFKA_JVM_PERFORMANCE_OPTS=" -XX:MetaspaceSize=96m -XX:+UseG1GC-XX:MaxGCPauseMillis=20 - XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M-XX:MinMetaspaceFreeRatio=50 - XX:MaxMetaspaceFreeRatio=80"

у рядку "зміст"

ми можемо отримати пропозицію, як редагувати файл з awk, sed, perl один лайнер тощо

приклад json перед оновленням

{
  "href" : "http://master02:8080/api/v1/clusters/HDP/configurations?type=kafka-env&tag=version1527250007610",
  "items" : [
    {
      "href" : "http://master02:8080/api/v1/clusters/HDP/configurations?type=kafka-env&tag=version1527250007610",
      "tag" : "version1527250007610",
      "type" : "kafka-env",
      "version" : 8,
      "Config" : {
        "cluster_name" : "HDP",
        "stack_id" : "HDP-2.6"
      },
      "properties" : {
        "content" : "\n#!/bin/bash\n\n# Set KAFKA specific environment variables here.\n\n# The java implementation to use.\nexport JAVA_HOME={{java64_home}}\nexport PATH=$PATH:$JAVA_HOME/bin\nexport PID_DIR={{kafka_pid_dir}}\nexport LOG_DIR={{kafka_log_dir}}\nexport KAFKA_KERBEROS_PARAMS={{kafka_kerberos_params}}\nexport JMX_PORT=9997\n# Add kafka sink to classpath and related depenencies\nif [ -e \"/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\" ]; then\n  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\n  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/lib/*\nfi\n\nif [ -f /etc/kafka/conf/kafka-ranger-env.sh ]; then\n. /etc/kafka/conf/kafka-ranger-env.sh\nfi",
        "is_supported_kafka_ranger" : "true",
        "kafka_log_dir" : "/var/log/kafka",
        "kafka_pid_dir" : "/var/run/kafka",
        "kafka_user" : "kafka",
        "kafka_user_nofile_limit" : "128000",
        "kafka_user_nproc_limit" : "65536"
      }
    }
  ]

очікуваний висновок (приклад json після оновлення)

{
  "href" : "http://master02:8080/api/v1/clusters/HDP/configurations?type=kafka-env&tag=version1527250007610",
  "items" : [
    {
      "href" : "http://master02:8080/api/v1/clusters/HDP/configurations?type=kafka-env&tag=version1527250007610",
      "tag" : "version1527250007610",
      "type" : "kafka-env",
      "version" : 8,
      "Config" : {
        "cluster_name" : "HDP",
        "stack_id" : "HDP-2.6"
      },
      "properties" : {
        "content" : "\n#!/bin/bash\n\n# Set KAFKA specific environment variables here.\n\n# The java implementation to use.\nexport JAVA_HOME={{java64_home}}\nexport PATH=$PATH:$JAVA_HOME/bin\nexport PID_DIR={{kafka_pid_dir}}\nexport LOG_DIR={{kafka_log_dir}}\nexport KAFKA_KERBEROS_PARAMS={{kafka_kerberos_params}}\nexport JMX_PORT=9997\n# Add kafka sink to classpath and related depenencies\nif [ -e \"/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\" ]; then\n  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\n  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/lib/*\nfi\n\nif [ -f /etc/kafka/conf/kafka-ranger-env.sh ]; then\n. /etc/kafka/conf/kafka-ranger-env.sh\nfi\nexport KAFKA_HEAP_OPTS=\"-Xmx8g -Xms8g\"\nKAFKA_JVM_PERFORMANCE_OPTS=\"-XX:MetaspaceSize=96m -XX:+UseG1GC-XX:MaxGCPauseMillis=20 - XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M-XX:MinMetaspaceFreeRatio=50 - XX:MaxMetaspaceFreeRatio=80\n"",
        "is_supported_kafka_ranger" : "true",
        "kafka_log_dir" : "/var/log/kafka",
        "kafka_pid_dir" : "/var/run/kafka",
        "kafka_user" : "kafka",
        "kafka_user_nofile_limit" : "128000",
        "kafka_user_nproc_limit" : "65536"
      }
    }
  ]

інший приклад рядка вмісту після оновлення

 "content" : "\n#!/bin/bash\n\n# Set KAFKA specific environment variables here.\n\n# The java implementation to use.\nexport JAVA_HOME={{java64_home}}\nexport PATH=$PATH:$JAVA_HOME/bin\nexport PID_DIR={{kafka_pid_dir}}\nexport LOG_DIR={{kafka_log_dir}}\nexport KAFKA_KERBEROS_PARAMS={{kafka_kerberos_params}}\nexport JMX_PORT=9997\n# Add kafka sink to classpath and related depenencies\nif [ -e \"/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\" ]; then\n  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\n  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/lib/*\nfi\n\nif [ -f /etc/kafka/conf/kafka-ranger-env.sh ]; then\n. /etc/kafka/conf/kafka-ranger-env.sh\nfi\nexport KAFKA_HEAP_OPTS=\"-Xmx8g -Xms8g\"\nKAFKA_JVM_PERFORMANCE_OPTS=\"-XX:MetaspaceSize=96m -XX:+UseG1GC-XX:MaxGCPauseMillis=20 - XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M-XX:MinMetaspaceFreeRatio=50 - XX:MaxMetaspaceFreeRatio=80\n"",
0
і чому скрипт оболонки починається з нової лінії?
додано Автор Thor, джерело
Що сталося з експортом ?
додано Автор Thor, джерело

6 Відповіді

Рішення Perl використовуйте модуль JSON :

perl -MJSON -we '
    $json = JSON->new->pretty->canonical;
    open $fh, "<", shift or die $!;
    $j = $json->decode(do { undef $/; <$fh> });
    $j->{items}[0]{properties}{content} .= qq(\nexport KAFKA_HEAP_OPTS="-Xmx8g -Xms8g"\nexport KAFKA_JVM_PERFORMANCE_OPTS=" -XX:MetaspaceSize=96m -XX:+UseG1GC-XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80");
    print $json->encode($j);
' -- file.json > new.json

Мені довелося виправити ваш очікуваний файл ( export відсутній для другої змінної, плюс деякі пробіли) і канонічно налаштувати його, щоб отримати точно такий же вихід.

6
додано
Можливо, ви маєте лише пакет perl , а не perl-core . Отже, встановіть perl-core або perl-JSON-PP .
додано Автор ColinD, джерело
Спробуйте використати JSON :: PP .
додано Автор ColinD, джерело
Яку ОС/розподіл ви використовуєте?
додано Автор ColinD, джерело
JSON :: PP знаходиться в ядрі Perl з 5.14.
додано Автор ColinD, джерело
@yael: Ваша установка Perl нестандартна. Він повинен містити бібліотеку.
додано Автор ColinD, джерело
Просто змініть обидві випадки JSON з JSON :: PP в моїй команді: perl -MSJON :: PP -we '$ json = JSON :: PP-> new ... .
додано Автор ColinD, джерело
@yael: Яку версію Perl ви використовуєте?
додано Автор ColinD, джерело
@yael Дві колони.
додано Автор ColinD, джерело
perl -MJSON :: PP -we '$ json = JSON :: PP-> new-> pretty-> канонічний; відкрити $ fh, "<", shift або die $ !; $ j = $ json-> декодувати (do {undef $ /; <$ fh>}); $ j -> {items} [0] {properties} {content}. = qq (не експортуйте KAFKA_HEAP_OPTS = "- Xmx8g -Xms8g" не експортуйте KAFKA_JVM_PERFORMANCE_OPTS = "-XX: MetaspaceSize = 96m -XX: + UseG1GC-XX: MaxGCPauseMillis = 20 -XX: InitiatingHeapOccupancyPercent = 35 -XX: G1HeapRegionSize = 16M -XX: MinMetaspaceFreeRatio = 50 -XX: MaxMetaspaceFreeRatio = 80 "); print $ json-> encode ($ j); '- file.json> new.json
додано Автор brismuth, джерело
Не вдається знайти JSON/PP.pm у @INC (@INC містить:/usr/local/lib64/perl5/usr/local/share/perl5/usr/lib64/perl5/vendor_perl/usr/share/perl5/vendor_perl/usr/lib64/perl5/usr/share/perl5.). Помилка BEGIN - компіляція перервана.
додано Автор brismuth, джерело
після заміни отримаємо - Невірне ім'я модуля JSON: PP з опцією -M: містить сингл ':'.
додано Автор brismuth, джерело
Це perl 5, версія 16, subversion 3 (v5.16.3) побудована для x86_64-linux-thread-multi (з 29 зареєстрованими патчами, див. Perl -V для більш докладної інформації)
додано Автор brismuth, джерело
не настільки яскравіше з perl, так як завантажити цей модуль, перш ніж запустити вашу команду? (У мене є perl -v Це perl 5, версія 16, subversion 3 (v5.16.3) побудована для x86_64-linux-thread-multi (з 29 зареєстрованими патчами, див. Perl -V для більш докладної інформації)
додано Автор brismuth, джерело
Не могли б Ви описати кроки для пошуку бібліотеки
додано Автор brismuth, джерело
Ви хочете встановити модуль - JSON :: PP
додано Автор brismuth, джерело
ми використовуємо RedHat 7, ОС
додано Автор brismuth, джерело
чи можна завантажити лише JSON.pm у робочу папку, а потім видалити її
додано Автор brismuth, джерело
Choroba ми отримуємо Неможливо знайти JSON.pm в @INC (@INC містить:/usr/local/lib64/perl5/usr/local// usr/lib64/perl5/usr/share/perl5.). Помилка BEGIN - компіляція перервана.
додано Автор brismuth, джерело

Не єдиний лайнер, але ...

$ new_lines='\\nexport KAFKA_HEAP_OPTS=\\"-Xmx8g -Xms8g\\"\\nexport KAFKA_JVM_PERFORMANCE_OPTS=\\" -XX:MetaspaceSize=96m -XX:+UseG1GC-XX:MaxGCPauseMillis=20 - XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M-XX:MinMetaspaceFreeRatio=50 - XX:MaxMetaspaceFreeRatio=80\\"'
$ new_content=$( jq '.items[0].properties.content' file.json | sed 's/"$/'"$new_lines"'"/')
$ jq '.items[0].properties.content = '"$new_content" file.json
{
  "href": "http://master02:8080/api/v1/clusters/HDP/configurations?type=kafka-env&tag=version1527250007610",
  "items": [
    {
      "href": "http://master02:8080/api/v1/clusters/HDP/configurations?type=kafka-env&tag=version1527250007610",
      "tag": "version1527250007610",
      "type": "kafka-env",
      "version": 8,
      "Config": {
        "cluster_name": "HDP",
        "stack_id": "HDP-2.6"
      },
      "properties": {
        "content": "\n#!/bin/bash\n\n# Set KAFKA specific environment variables here.\n\n# The java implementation to use.\nexport JAVA_HOME={{java64_home}}\nexport PATH=$PATH:$JAVA_HOME/bin\nexport PID_DIR={{kafka_pid_dir}}\nexport LOG_DIR={{kafka_log_dir}}\nexport KAFKA_KERBEROS_PARAMS={{kafka_kerberos_params}}\nexport JMX_PORT=9997\n# Add kafka sink to classpath and related depenencies\nif [ -e \"/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\" ]; then\n  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\n  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/lib/*\nfi\n\nif [ -f /etc/kafka/conf/kafka-ranger-env.sh ]; then\n. /etc/kafka/conf/kafka-ranger-env.sh\nfi\nexport KAFKA_HEAP_OPTS=\"-Xmx8g -Xms8g\"\nexport KAFKA_JVM_PERFORMANCE_OPTS=\" -XX:MetaspaceSize=96m -XX:+UseG1GC-XX:MaxGCPauseMillis=20 - XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M-XX:MinMetaspaceFreeRatio=50 - XX:MaxMetaspaceFreeRatio=80\"",
        "is_supported_kafka_ranger": "true",
        "kafka_log_dir": "/var/log/kafka",
        "kafka_pid_dir": "/var/run/kafka",
        "kafka_user": "kafka",
        "kafka_user_nofile_limit": "128000",
        "kafka_user_nproc_limit": "65536"
      }
    }
  ]
}

Щоб перевірити новий вміст, зрозуміло:

$ printf "$new_content\n"
"
#!/bin/bash

# Set KAFKA specific environment variables here.

# The java implementation to use.
export JAVA_HOME={{java64_home}}
export PATH=$PATH:$JAVA_HOME/bin
export PID_DIR={{kafka_pid_dir}}
export LOG_DIR={{kafka_log_dir}}
export KAFKA_KERBEROS_PARAMS={{kafka_kerberos_params}}
export JMX_PORT=9997
# Add kafka sink to classpath and related depenencies
if [ -e "/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar" ]; then
  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar
  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/lib/*
fi

if [ -f /etc/kafka/conf/kafka-ranger-env.sh ]; then
. /etc/kafka/conf/kafka-ranger-env.sh
fi
export KAFKA_HEAP_OPTS="-Xmx8g -Xms8g"
export KAFKA_JVM_PERFORMANCE_OPTS=" -XX:MetaspaceSize=96m -XX:+UseG1GC-XX:MaxGCPauseMillis=20 - XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M-XX:MinMetaspaceFreeRatio=50 - XX:MaxMetaspaceFreeRatio=80""
3
додано
Залежно від операційної системи, це просто yum install jq
додано Автор Oliv, джерело
додано Автор Oliv, джерело
не в моєму репо, тому мені потрібно завантажити цю jq
додано Автор brismuth, джерело
@Dear Glenn Я буду з вами чесним, ваше рішення блискуче, але нам потрібно зробити це на сайтах, і ми не дозволяємо встановлювати команду jq, якщо у вас є інша альтернатива без jq, я з задоволенням побачу її якщо не, я спробую попросити клієнта встановити команду jq на його машині linux Btw - чи можна завантажити команду jq, чи це один оборотів в хвилину? , Я з радістю підключиться до вас linkedin.com/in/glennjackman
додано Автор brismuth, джерело

sed one liner.

$ sed -i '/"content"/s/",$/\\nexport KAFKA_HEAP_OPTS=\\"-Xmx8g -Xms8g\\"\\nKAFKA_JVM_PERFORMANCE_OPTS=\\"-XX:MetaspaceSize=96m -XX:+UseG1GC-XX:MaxGCPauseMillis=20 - XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M-XX:MinMetaspaceFreeRatio=50 - XX:MaxMetaspaceFreeRatio=80\\n"",/' myfile
2
додано
@ jas-: Але це може порушити роботу, якщо зміниться формат JSON.
додано Автор ColinD, джерело
0 залежностей і відповідь на запит
додано Автор gnom1gnom, джерело
Приємний і читабельний. Великий.
додано Автор Derek Lewis, джерело

Це просте виправлення, коли Perl додає рядки до рядка (кожен рядок) із вмістом content без аналізу JSON-документа. Це один лайнер (скопіюйте та вставте в командний рядок). Думаю, ви хочете цього:

Тут in на початку є вхідним файлом. Ви отримуєте вихід на екрані, який можна легко налаштувати. Ви також можете змінити файл на місці за допомогою перемикача -i . (Спершу дізнайтеся про це.)

Вихідні дані:

{
  "href" : "http://master02:8080/api/v1/clusters/HDP/configurations?type=kafka-env&tag=version1527250007610",
  "items" : [
    {
      "href" : "http://master02:8080/api/v1/clusters/HDP/configurations?type=kafka-env&tag=version1527250007610",
      "tag" : "version1527250007610",
      "type" : "kafka-env",
      "version" : 8,
      "Config" : {
        "cluster_name" : "HDP",
        "stack_id" : "HDP-2.6"
      },
      "properties" : {
        "content" : "\n#!/bin/bash\n\n# Set KAFKA specific environment variables here.\n\n# The java implementation to use.\nexport JAVA_HOME={{java64_home}}\nexport PATH=$PATH:$JAVA_HOME/bin\nexport PID_DIR={{kafka_pid_dir}}\nexport LOG_DIR={{kafka_log_dir}}\nexport KAFKA_KERBEROS_PARAMS={{kafka_kerberos_params}}\nexport JMX_PORT=9997\n# Add kafka sink to classpath and related depenencies\nif [ -e \"/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\" ]; then\n  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\n  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/lib/*\nfi\n\nif [ -f /etc/kafka/conf/kafka-ranger-env.sh ]; then\n. /etc/kafka/conf/kafka-ranger-env.sh\nfi",\nexport KAFKA_HEAP_OPTS="-Xmx8g -Xms8g"\n export KAFKA_JVM_PERFORMANCE_OPTS=" -XX:MetaspaceSize=96m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80"\n"
        "is_supported_kafka_ranger" : "true",
        "kafka_log_dir" : "/var/log/kafka",
        "kafka_pid_dir" : "/var/run/kafka",
        "kafka_user" : "kafka",
        "kafka_user_nofile_limit" : "128000",
        "kafka_user_nproc_limit" : "65536"
      }
    }
  ]

Як ви бачите, тут я зробив виправлення:

export KAFKA_HEAP_OPTS="-Xmx8g -Xms8g"\nexport KAFKA_JVM_PERFORMANCE_OPTS=" -XX:MetaspaceSize=96m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80"\n

Я змінив макет опції -XX , а закінчення - -XX: MaxMetaspaceFreeRatio = 80 "\ _ n , а не - XX: MaxMetaspaceFreeRatio = 80 \ t/code>, як вам потрібно. Так що змініть це, якщо це те, що ви дійсно хочете. Також новий рядок перед shebang є те, що я видалити. Але я залишив це для вас.

2
додано

За допомогою jq :

v1='export KAFKA_HEAP_OPTS="-Xmx8g -Xms8g"'
v2='export KAFKA_JVM_PERFORMANCE_OPTS=" -XX:MetaspaceSize=96m -XX:+UseG1GC-XX:MaxGCPauseMillis=20 - XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M-XX:MinMetaspaceFreeRatio=50 - XX:MaxMetaspaceFreeRatio=80"'

jq --arg v1 "$v1" --arg v2 "$v2" '.items[].properties.content += $v1 + "\n" + $v2 + "\n"' infile.json
1
додано
 perl -lpe '
    BEGIN {
       my $a = q[export KAFKA_HEAP_OPTS="-Xmx8g -Xms8g"];

       my $b = q[export KAFKA_JVM_PERFORMANCE_OPTS=" -XX:MetaspaceSize=96m -XX:+UseG1GC-XX:MaxGCPauseMillis=20 - XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M-XX:MinMetaspaceFreeRatio=50 - XX:MaxMetaspaceFreeRatio=80"];

       push @A, s/[\\"]/\\$&/gr for $a, $b;
    }

    /^\h*"content"/ and
       $_ = 
          join q[], 
             join(q[\n], 
                split(/",?$/), @A),
             /(",?)$/;
 '    json-file

Робота:

Store the data to be added in scalar variables using the single quote operator to avoid backslashing.

Change all backslashes, double quotes to their escaped versions.

Потім у цільовій лінії розбийте її на ", |,    і приєднувати елементи плюс масив @A вмісту з літерним рядком n і закінчуючи цитатами закриття.

1
додано
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram