См. команду parallel
(из пакета moreutils
во многих дистрибутивах ). Со страницы руководства:
parallel runs the specified command, passing it a single one of the specified arguments. This is repeated for each argument. Jobs may be run in parallel. The default is to run one job per CPU.
Так:
parallel analysis.C -- a.0????.txt
Использование любого sed в любой оболочке на каждом сервере Unix:
$ sed 's/Inventory for \([^ ]*\).*PID: \([^,]*\).*SN:/\1 \2/' file
30844-ap01 AIR-AP1832I-E-K9 KWC21420CKU
ckh.hq-ap99 AIR-CAP2702I-E-K9 FCW2007N0ZQ
AP0042.6843.ab78 AIR-CAP1702I-E-K9 FCZ201622NY
Я думаю, что лучшим инструментом для таких работ является grep
с PCRE
функциями:
grep -Po '(?<=Inventory for )[^ ]+|(?<=PID: )[^,]+|(?<=SN: ).{11}' data
Но у этого есть недостаток, заключающийся в том, что каждое совпадение печатается в отдельных строках:
30844-ap01
AIR-AP1832I-E-K9
KWC21420CKU
ckh.hq-ap99
AIR-CAP2702I-E-K9
FCW2007N0ZQ
AP0042.6843.ab78
AIR-CAP1702I-E-K9
FCZ201622NY
Давайте переключимся на perl
и сделаем то же самое:
perl -lne ' $i = $& if /(?<=Inventory for )[^ ]+/; $p = $& if /(?<=PID: )[^,]+/ ; $s = $& if /(?<=SN: ).{11}/; print join " ", $i, $p, $s' data
Печать:
30844-ap01 AIR-AP1832I-E-K9 KWC21420CKU
ckh.hq-ap99 AIR-CAP2702I-E-K9 FCW2007N0ZQ
AP0042.6843.ab78 AIR-CAP1702I-E-K9 FCZ201622NY
Использованиеgawk
:
awk '{a=b=c=$0;
gsub(/^.*Inventory for |.*$/,"",a);
gsub(/^.*PID: |,.*$/, "",b);
sub(/^.*SN: /,"",c); c=substr(c,1,11);
print a,b,c}' input
Первые три переменные a
, b
и c
устанавливаются в текущую входную запись ($0
).Затем встроенный -в функцию gsub()
изменяет регулярное выражение на пустую строку(""
). Регулярное выражение здесь (/^.*Inventory for |.*$/
использует чередование, имеет два шаблона /^.*Inventory for /
и /.*$/
. Чередование позволяет использовать альтернативный шаблон в регулярном выражении с |
. С gsub()
от начала строки(^
)до Inventory for
изменяется на ""
. Это означает, что все символы от начала строки до первой строки, которую мы хотим, удаляются. Точно так же из пробела (после первой строки мы хотим, чтобы )до конца строки были изменены на ""
. Точно так же /^.*PID: |,.*$/
имеет два альтернативных шаблона. /^.*PID: /
и /,.*$/
. Оба они изменены на ""
.
Затем sub()
изменяет /^.*SN: /
на пустую строку, а substr(c,1,11)
берет строку длиной 11 символов из c
.