Вот быстрый и грязный подход с использованием 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 или [. . ..] От вашего командира
Извините, но это явный абсурд. Вот один (из многих) способов сделать это в каждом из этих инструментов:
Bourne (снова) оболочка. Не используйте это, я показываю это только для того, чтобы продемонстрировать, что это возможно.
$ pat = (srcip = srczone = протокол = dstip = dstzone = dstport = имя_правила =);
$ o = ""; пока IFS =, прочтите поля -a; выполните
вместо f в "$ {fields [@]}"; сделать
вместо пат в "$ {pat [@]}"; сделать
[[$ f = ~ $ pat]] && o = "$ f, $ o"
готово
готово
готово
Awk
Сохраните целевые шаблоны в файле:
$ cat patterns
srcip
srczone
протокол
dstip
dstzone
dstport
имя_правила
Затем:
$ awk -F, '(NR == FNR) {
пат [$ 0] ++;
далее;
}
{
for (i = 1; i
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
Оболочка Борна (или любая оболочка 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
Используйте комм
спецификатор формата:
ps -C beam.smp,docker -o pid,user:20,%cpu,%mem,comm,args
Здесь отображается имя команды, которое вы фильтруете с помощью селектора -C
.