Помощь скриптов Awk - Проблема с логикой - PullRequest
2 голосов
/ 01 октября 2008

В настоящее время я пишу простой скрипт .sh для анализа файла журнала Exim на наличие строк, соответствующих «o». В настоящее время при просмотре файла output.txt на каждой строке печатается 0 (606 строк). Я предполагаю, что моя логика неверна, так как awk не выдает никаких ошибок.

Вот мой код (обновлен для конкатенации и встречных проблем). Изменить: я принял новый код из ответа dmckee, с которым я сейчас работаю над старым кодом в пользу простоты.

awk '/o'\''/ {
         line = "> ";
         for(i = 20; i <= 33; i++) {
           line = line " " $i;
         }
         print line;
    }' /var/log/exim/main.log > output.txt

Есть идеи?

РЕДАКТИРОВАТЬ: Ради ясности, я говорю «o» в адресах электронной почты, потому что «это недопустимый символ в адресах электронной почты (и в наших базах данных появляется только с префиксами o»)

РЕДАКТИРОВАТЬ 2: В соответствии с запросом на комментарий, вот санитарный образец некоторого желаемого результата:

[xxx.xxx.xxx.xxx] kathleen.o'toole@domain.com <kathleen.o'toole@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] julie.o'brien@domain.com <julie.o'brien@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] james.o'dell@domain.com <james.o'dell@domain.com> routing defer (-51): retry time not reached

[xxx.xxx.xxx.xxx] daniel_o'leary@domain.com <aniel_o'leary@domain.com> routing defer (-51): retry time not reached

Причина, по которой я начинаю с 20 в цикле, состоит в том, что все, что находится до 20-го поля, является просто стандартной информацией журнала, которая здесь не нужна для моих целей. Все, что мне нужно, это все от IP и выше для этого решения (сообщения для каждой ошибки 550 различны для каждого используемого почтового сервера. Я собираю список наиболее распространенных)

Ответы [ 4 ]

3 голосов
/ 02 октября 2008

+ означает сложение чисел в awk. Если вы хотите объединить, просто поместите константы и / или выражения через пробел.

Итак, это

line += " " + $i

должно стать

line = line " " $i

РЕДАКТИРОВАТЬ: Если Файлы журнала exim (я больше в Postfix :) разделены одним пробелом, не так просто:

grep -F o\' /var/log/exim/main.log | cut -d\  -f20-33 >output.txt

2 голосов
/ 02 октября 2008

Здесь нет особой необходимости в grep. Пусть awk выберет подходящие для вас строки (и исправит ошибку конкатенации согласно ΤΖΩΤΖ):

awk '/o'\''/ {
             line = "> ";
             for(i = 20; i <= 33; i++) {
               line = line " " $i;
             }
             print line;
        }' /var/log/exim/main.log > output.txt

Конечно, в конечном итоге вам понадобится какое-то странное спасение, если вы сделаете это по подсказке, как описано выше. Это чище в скрипте ...


Редактировать: на первом проходе я пропустил проблему + = ...

Также предполагается, что указанная выше строка является частичной, поскольку в ней всего 13 полей (по умолчанию поля разделены пробелами).

1 голос
/ 02 октября 2008

Вне задачи, и еще проще: python.

import fileinput
for line in fileinput.input():
    if "'" in line:
        fields = line.split(' ')
        print "> ", ' '.join( fields[20:34] )
1 голос
/ 02 октября 2008

"'" не является незаконным в местных частях. От RFC2821 , раздел 4.1.2:

Local-part = Dot-string / Quoted-string

Dot-string = Atom *("." Atom)

Atom = 1*atext

2821 дальнейшие ссылки RFC2822 для не локально определенных элементов, поэтому:

atext           =       ALPHA / DIGIT / ; Any character except controls,
                        "!" / "#" /     ;  SP, and specials.
                        "$" / "%" /     ;  Used for atoms
                        "&" / "'" /
                        "*" / "+" /
                        "-" / "/" /
                        "=" / "?" /
                        "^" / "_" /
                        "`" / "{" /
                        "|" / "}" /
                        "~"

Другими словами, «» - это совершенно законный, без кавычек, в котором есть локальная часть письма. Теперь это может быть не разрешено на вашем сайте , но это не то, что вы сказали.

Извините, что не остановился на теме, но я хотел исправить ваше утверждение.

...