sed - Как мне сопоставить этот шаблон?

Для входящих ssh соединений (без отслеживания соединения)

iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 22

Для исходящих ssh соединений (без отслеживания соединения)

iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 22

Вы должны иметь возможность объединить их, используя -порт вместо -порт и --спорт

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

0
06.01.2019, 15:40
3 ответа

Этот ответ основан на приведенном выше ответе, который очень похож на JSON, поэтому я ' Поэтому мы предположили, что это, вероятно, JSON . Но в вашем образце он неполный, что, как я полагаю, является опечаткой. Если это не так ... ну, у вас уже есть ответы sed .

Пожалуйста, не используйте регулярное выражение для синтаксического анализа JSON . Это мерзко. regex плохо работает с рекурсивными типами данных с тегами, такими как JSON / XML . В лучшем случае это грязный хакер, который в будущем создаст хрупкий код.

Точно так же - JSON важно, чтобы он был полным - мне пришлось угадывать, как выглядит ваш полный JSON .

Предположим, что JSON подобен этому (использовался http://jsonlint.com/ для очистки элементов)

{
    "s220823vaps2512": {
        "hostname": "s220823vaps2512",
        "description": "data",
        "type": "Virtual",
        "os": "data",
        "idc": "data",
        "environment": "data",
        "deviceclass": "data",
        "cores": "data",
        "memory": "data",
        "frontnet": "data",
        "ipset": {
            "backnet": "data",
            "storagenet": "data",
            "metroclusternet": "data"
        },
        "roles": "data",
        "mounts": "data"
    },
    "s220823vaps2513": {
        "hostname": "s220823vaps2513",
        "description": "data",
        "type": "Virtual",
        "os": "data",
        "idc": "data",
        "environment": "data",
        "deviceclass": "data",
        "cores": "data",
        "memory": "data",
        "frontnet": "data",
        "ipset": {
            "backnet": "data",
            "storagenet": "data",
            "metroclusternet": "data"
        }
    }
}

Тогда способ просто получить нужные биты:

#!/usr/bin/env perl
use strict;
use warnings;

use JSON;

my $input = ### as above, snipped for brevity. 

#decode/validated
my $json = decode_json ( $input );
#create new JSON array of elements. 
my $new_json = [map { $json -> {$_} } keys %$json];
#print it out. 
print to_json ( $new_json, { pretty => 1, canonical => 1 } );

И таким образом вы создаете допустимый вывод JSON, а также обрабатываете случаи, когда, например, порядок ключей другой (который полностью действителен в JSON).

2
28.01.2020, 02:35

Просто с sed :

sed 's/^[^{]*{/{/' file
  • Просто ищет строки, начинающиеся с символов, которые не являются { ( ^ [^ {] ), ноль или более раз * , за которым следует {.
  • Все это заменено одним {.

Изменить : если вы хотите исключить некоторые шаблоны из замены (например, строка "ipset": ), используйте это:

sed '/"ipset":/n;s/^[^{]*{/{/' file
  • Если строка начинается с "ipset ": , перейти к следующей строке n .
0
28.01.2020, 02:35

Похоже, это работает, по крайней мере, на примере предоставленных вами данных:

sed -'s/^ .*{/{/' file 

Он преобразует первую строку каждого блока "имя" { (обратите внимание на начальный пробел) до {

0
28.01.2020, 02:35

Теги

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