Очевидным решением было попросить logstash
заключить запись каждого поля в '[] с опцией
include_brackets => true', а затем добавить фильтры для обработки этого.
В конце концов, правильный фильтр для импорта данных с учетом строки, поступающей из redis, в /etc/logstash/conf.d/filter.conf
:
filter {
mutate {
gsub => [
"message", "{u'", "",
"message", "': u'", ": [",
"message", "', u'", "], ",
"message", "'}", "]"
]
}
kv {
source => "message"
field_split => ", "
value_split => ": "
remove_tag => [ "_jsonparsefailure" ]
include_brackets => true
}
}
Вы можете комбинировать тесты в find
с - o
означает «или»; неявный оператор между тестами - «и». Например:
subs="$(find -maxdepth 2 -type d \( \
-name "*-nom1" -o -name "*-nom2" -o -name "*-nom3" \
\) )"
for d in $subs ; do
... do something with "$d" ...
done
Скобки вокруг `-name" -nom1 "-o -name" -nom2 "-o" * -nom3 "необходимо заключить в кавычки, потому что они зарезервированы для оболочки.
Теперь, как замечает don_crissti в комментарии, общая рекомендация - избегать захвата вывода find
по двум причинам; во-первых, потому что имена файлов могут содержать пробелы и символы новой строки, а также специальные символы и сын; во-вторых, потому что find
по самой своей природе зацикливается на результатах. Лучше всего использовать неявный цикл в find
; см. Почему перебор вывода find является плохой практикой и связанное обсуждение:
find -maxdepth 2 -type d \( \
-name "*-nom1" -o -name "*-nom2" -o -name "*-nom3" \
\) -exec \
... do something with '{}' ...
\;
Две вещи, которые я могу придумать
Объединить три вызова find
в один
find -maxdepth 2 -type d \ (-name '* -nom1' -o -name '* - nom2 '-o -name' * -nom3 '\)
Используйте возможность find
выполнять команды, чтобы избежать внешнего цикла
find -maxdepth 2 -type d \ (-name '* -nom1' -o -name '* -nom2' -o -name '* -nom3' \) \
- exec sh -c 'для d ; сделать cd "$ d"; cmd1; cmd2; cmd3; ...; done 'sh {} +