Я не думаю, что возможно делать то, что вы ищете. Я не знаю ни одной реализации в
, которая могла бы изнутри задания вносить какие-либо реальные изменения в результирующие заголовки сообщений.
Однако вы можете запустить сценарий как подпроцесс, который производит вывод HTML, перенаправляет этот вывод в файл и при необходимости добавляет любые окружающие заголовки перед передачей всего результирующего текстового блоба в sendmail -bm
как есть (и полагаясь на sendmail
для определения полей отправителя и получателя).
Что-то вроде очень надуманного примера:
>tempfile
echo 'From: nobody@localhost' >>tempfile
echo 'To: root@localhost' >>tempfile
echo 'Subject: list of files' >>tempfile
echo >>tempfile
ls -lh $HOME >>tempfile
echo 'Add more data here' >>tempfile
sendmail -bm <tempfile && rm -f tempfile
может делать примерно то, что вы хотите. (Вам, конечно, придется отрегулировать приведенное выше, чтобы включить все, что указывает на то, что вывод - это HTML.)
$ awk 'BEGIN {FS=":"} {comments[$1][NR]=$3} END {for (bug in comments) { print bug; for (comment in comments[bug]) { print " ",comments[bug][comment] } } } ' /path/to/input
Bug123
SomeComment
SecondComment
Bug222
SomeOtherComment
Это работает путем создания многомерного -массива при чтении входного файла и последующего обхода результирующих данных в порядке появления «ошибок». С некоторыми небольшими изменениями это можно изменить для сортировки массива внешнего уровня -.
Вот забавный способ сделать это вvi
(или, на самом деле, в ex
, если вы опускаете начальные двоеточия для каждой команды):
:%!awk -F: '{a[$1];print} END {for (i in a) {print i}}'
:v/:/m0
:%!sort -st: -k1,1
:%s/^.*:/\t/
Пояснение:
Команда Awk печатает каждую строку как -и выводит список всех уникальных первых полей в конце вашего файла.
Команда v
m
перемещает на строку 0 (начало файла )все строки, в которых нет двоеточия. (Другими словами, список первых полей, выводимых из awk
.)
Команда sort
выполняет сортировку таблицы s
, сохраняя порядок строк, кроме расположения их в соответствии с первым полем. (Мы уже переместили поля «заголовок» в начало файла.)
Затем команда замены s
превращает префикс каждой строки заголовка, отличной от -, во вкладку.
Результат предоставленного вами ввода:
Bug123
SomeComment
SecondComment
Bug222
SomeOtherComment
Дополнительные пояснения:
:
(двоеточие )— это то, что вы вводите в vi
, чтобы начать команду в стиле ex
-.
%
— это диапазон адресов в ex
. Это означает «применить следующее действие/команду ко всем строкам в файле буфера ()».
При использовании с адресом !
начинает «фильтр» вex
:строки, указанные адресом, подаются в качестве входных данных для указанной внешней команды и заменяются в буфере выходными данными этой команды.
-F:
устанавливает разделитель полей Awk.
{}
(фигурные скобки )используются в Awk для окружения команд, которые должны быть запущены. Поскольку перед фигурными скобками (в одинарных кавычках )нет адреса Awk , действия в фигурных скобках применяются к каждой строке ввода.
a[$1]
создает элемент массива, используя первое поле текущей строки($1
)в качестве индекса. Поскольку здесь не указано = "whatever"
, элемент массива не имеет значения , но это не имеет значения; мы просто хотим, чтобы массив содержал этот элемент.
;
завершает эту команду Awk.
print
— это команда Awk для печати текущей строки (по умолчанию )или любых переданных аргументов (, как в более позднемprint i
).
END
помечает блок действий (в фигурных скобках )для выполнения после обработки всех входных данных (в Awk ).
Цикл for
печатает все индексы массива с именем a
. Какие из первых полей файла журнала de -дублируются в произвольном порядке.
Вот вам и команда Awk.
Команда v
— это команда ex
, противоположная общей команде g
. g
выполняет действие над всеми строками, соответствующими определенному шаблону. v
выполняет указанное действие на всех строках, НЕ соответствующих заданному шаблону.
/
запускает и заканчивает шаблон. В данном случае это просто :
.
m
означает «движение». Таким образом, :v/:/m0
в vi
перемещает все строки, не содержащие двоеточий, в начало файла.
Остальные команды должны быть достаточно понятными.:)
перламутровый -вкладыш
perl -MList::Util=uniq -F: -lane '
push @keys, $F[0];
push @{ $comment{$F[0]} }, $F[2];
} END {
for $key (uniq @keys) {
print $key;
print " $_" for @{$comment{$key}};
}
' file