Отображение имени процесса с помощью ps

Вот быстрый и грязный подход с использованием perl :

$ perl -F, -lane '@l = grep {/srcip|srczone|protocol|dstip|dstzone|dstport|rule_name/} @F; 
                  print join ",",@l' file 
srcip=1.1.1.1,srczone=internal,protocol=6,dstip=2.2.2.2,dstport=80,dstzone=external,rule_name=Deny_All

-a заставляет perl действовать как awk и разбивать свои входные строки на символ, заданный - F , сохранив их как элементы массива @F . Затем мы grep массив и сохраняем элементы, соответствующие вашим целевым словам в массиве @l , и, наконец, печатаем @l , соединенные запятыми.

Обратите внимание, что это не удастся, если какой-либо из ваших паттернов может быть подшаблоном (скажем, у вас есть foo = bar и foobar = baz ).

Для более длинных списков целевых шаблонов (при условии, что вы не хотите писать фактический скрипт) вы можете сохранить их в массиве и присоединить к ним с помощью | , чтобы создать регулярное выражение для grep. И добавляя \ b вокруг каждого шаблона, вы также защищаете от совпадения подшаблонов. Если мы также удалим ненужный массив temp, мы получим:

$ perl -F, -lane '
    BEGIN{
     $pat="\\b" . join "\\b|",qw(srcip= srczone= protocol= dstip= dstzone= dstport= rule_name=)
    } print join ",",grep {/$pat/}@F' file 
srcip=1.1.1.1,srczone=internal,protocol=6,dstip=2.2.2.2,dstport=80,dstzone=external,rule_name=Deny_All

Наш постоянный эксперт сказал, что это невозможно сделать в оболочке bourne независимо от sed awk или [. . ..] От вашего командира

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

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

     $ pat = (srcip = srczone = протокол = dstip = dstzone = dstport = имя_правила =); 
     $ o = ""; пока IFS =, прочтите поля -a; выполните 
    вместо f в "$ {fields [@]}"; сделать 
    вместо пат в "$ {pat [@]}"; сделать 
     [[$ f = ~ $ pat]] && o = "$ f, $ o" 
    готово 
    готово 
    готово 
  2. Awk

    Сохраните целевые шаблоны в файле:

     $ cat patterns 
    srcip 
    srczone 
    протокол 
    dstip 
    dstzone 
    dstport 
    имя_правила 
     

    Затем:

     $ awk -F, '(NR == FNR) {
    пат [$ 0] ++; 
    далее; 
    } 
     {
    for (i = 1; i 
  3. sed (и оболочка)

     $ pat = (srcip = srczone = protocol = dstip = dstzone = dstport = rule_name =); 
     $ for p в $ {pat [@]} ; do 
    sed -E "s /.*($ p [^,] *). * / \ 1 /" file; сделано | 
    sed ': a; N; $! Ba; s / \ n /, / g' 
    srcip = 1.1.1.1, srczone = internal, protocol = 6, dstip = 2.2.2.2, dstzone = external, dstport = 80, rule_name = Deny_All 
     
  4. Оболочка Борна (или любая оболочка POSIX) + sed (как для 1., не делайте этого, это возможно, но глупо)

     $ установите srcip = srczone = protocol = dstip = dstzone = dstport = rule_name = 
     $ для f в "$ @"; do sed "s /.*\($ f [^,] * \). * / \ 1 /" файл; сделано | sed ': a; N; $! ba; s / \ n /, / g' 
    srcip = 1.1.1.1, srczone = internal, protocol = 6, dstip = 2.2.2.2, dstzone = external, dstport = 80, rule_name = Deny_All 
     

1
22.11.2016, 12:02
1 ответ

Используйте комм спецификатор формата:

ps -C beam.smp,docker -o pid,user:20,%cpu,%mem,comm,args

Здесь отображается имя команды, которое вы фильтруете с помощью селектора -C .

3
27.01.2020, 23:25

Теги

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