Pregunta

Actualmente estoy escribiendo un script simple .sh para analizar un archivo de registro Exim para cadenas que coinciden con " o '' '. Actualmente, al ver output.txt, todo lo que hay es un 0 impreso en cada línea (606 líneas). Supongo que mi lógica es incorrecta, ya que awk no arroja ningún error.

Aquí está mi código (actualizado para problemas de concatenación y contador). Editar: he adoptado un código nuevo de la respuesta de dmckee con el que ahora estoy trabajando sobre el código anterior a favor de la simplicidad.

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

¿Alguna idea?

EDITAR: por razones de claridad, estoy buscando '' o '' ' en direcciones de correo electrónico, porque 'es un carácter ilegal en las direcciones de correo electrónico (y en nuestras bases de datos, solo aparece con nombres con prefijo o').

EDIT 2: según la solicitud de comentarios, aquí hay una muestra desinfectada de algunos resultados deseados:

[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

La razón por la que empiezo a 20 en mi ciclo es porque todo antes del campo 20 es solo información de registro estándar que no es necesaria para mis propósitos aquí. Todo lo que necesito es todo, desde el IP y más allá, para esta solución (los mensajes para cada error 550 son diferentes para cada servidor de correo en uso. Estoy compilando una lista de los comunes)

¿Fue útil?

Solución

No hay una necesidad real de grep aquí. Deje que awk seleccione las líneas coincidentes por usted (y arregle su error de concatenación según ??O?????):

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

Por supuesto, terminas necesitando un escape extraño si lo haces como se indica arriba. Está más limpio en un script ...


Editar: en la primera pasada me perdí el problema + = ...

También suponiendo que la línea que proporcionó arriba es parcial, ya que solo tiene 13 campos (por defecto, los campos están delimitados por espacios en blanco).

Otros consejos

+ significa suma numérica en awk. Si desea concatenar, simplemente coloque las constantes y / o expresiones separadas con espacios.

Entonces, esto

line += " " + $i

debería convertirse

line = line " " $i

EDITAR: Iff los archivos de registro de exim (estoy más interesado en Postfix :) están separados por un solo espacio, no es lo siguiente más simple:

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

?

" '" No es ilegal en partes locales. De RFC2821 , sección 4.1.2:

Local-part = Dot-string / Quoted-string

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

Atom = 1*atext

2821 referencias adicionales RFC2822 para elementos no definidos localmente, entonces:

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

En otras palabras, " '" es un personaje sin comillas perfectamente legal que se caracteriza por tener en una parte local de correo electrónico. Ahora, puede que no sea legal en su sitio , pero eso no es lo que dijo.

Perdón por no permanecer directamente en el tema, pero quería corregir su afirmación.

Fuera de tarea, y aún más simple: python.

import fileinput
for line in fileinput.input():
    if "'" in line:
        fields = line.split(' ')
        print "> ", ' '.join( fields[20:34] )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top