Bash awk/sed извлекает несколько строк из одной большой строки, используя ключевые слова

См. команду 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
1
29.05.2021, 22:00
3 ответа

Использование любого 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
3
28.07.2021, 11:28

Я думаю, что лучшим инструментом для таких работ является 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
2
28.07.2021, 11:28

Использование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.

0
28.07.2021, 11:28

Теги

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