@ Решение Герберта, вероятно, самое простое, но вы также можете использовать lookarounds:
$ grep -Poz '(?<=:MENU1\n)[^:]*' file
0. public
1. admin
2. webmail
-121--82049-
Причина его отказа с этой ошибкой - интерполяция $ (seq 1 $ k)
внутри команды fanout
.
Позвольте мне объяснить...
Выполнение seq 1 2
возвращает следующее значение:
1
2
Это значение находится внутри двойных кавычек, поэтому новая строка сохраняется в виде значимого текста. Поэтому команда fanout вычисляется следующим образом:
fanout server1 'umask 022 ; for k in 1
2 ; do for i in ear2 ; do echo /appl/as/bin/md5 /appl/as/var/spool/ears/abc/ ; done ; done'
Ваш ksh
не понимает 2
на второй строке, поэтому он уступает.
Вы можете исправить это с помощью xargs
, но затем вы попали во вторую потенциальную проблему, где вы используете k
в качестве счетчика цикла, но $ k
вычисляется до запуска цикла. Кроме того, имеется вложенный корпус, в котором $ ears
необходимо оценить перед запуском сценария, но он используется в цикле, который изменяется во время выполнения.
Я нашел справочную страницу для fanout
, но я не понимаю, почему вы запускаете цикл для одной системы ( server1
), когда существует fanout
для выполнения команды для нескольких систем. Если вы можете объяснить разницу между сервером и ухом , я могу предложить более чистый фрагмент кода. Мое первое предложение может быть таким:
ears='ear1,ear2'
cluster=abc
dmgr=server1
fanout "$dmgr" "/appl/as/bin/md5 /appl/as/var/spool/ears/${cluster}/{$ears}"
-121--254083-
Оригинальная оболочка не имела этой функции, но имела комментарии. Необходим механизм, позволяющий пользователю указать, какую оболочку/интерпретатор использовать. Этот механизм не должен излишне ломать старые системы (любые новые сценарии, написанные для исходной оболочки, должны быть разрешены для указания исходной оболочки, и не должен ломаться на старых системах (запущенных ранних версиях исходной оболочки), которые не знают об этой новой системе. Поэтому он должен выглядеть как комментарий к оригинальной оболочке. Эта новая система должна также снизить риск ложных триггеров, не возлагая при этом нагрузки на будущих пользователей.
Поэтому было решено добавить специальный комментарий в начале файла.
Одной из возможностей, которая не требует разветвления, является использование socat
подробного вывода, а не данных. Моя версия socat -v
включает длину данных в подробный вывод, так что вы знаете, где она заканчивается. Например,
mkfifo mypipe
while sleep 3
do printf "%sNONEWLINE" $RANDOM
done |
socat -u - UDP4:localhost:9999 &
socat -u -v UDP-RECV:9999 - >/dev/null 2>mypipe &
cat -uv mypipe
будет выводить перед каждым элементом данных (, например,9430NONEWLINE
)заголовок, начинающийся >
с датой и длиной.
> 2018/07/28 10:29:33.965222 length=13 from=0 to=12
9430NONEWLINE> 2018/07/28 10:29:36.968335 length=14 from=13 to=26
26947NONEWLINE> 2018/07/28 10:29:39.971025 length=14 from=27 to=40
15126NONEWLINE
Используйте sed
, чтобы добавить новую строку с помощью одной команды, чтобы избежать состояния гонки при использовании вывода SYSTEM:"cat; echo \"\n\""
:
socat -u UDP-RECVFROM:9999,fork SYSTEM:"sed -e a\\\\"