2015-03-02 2 views
0

Я пытаюсь извлечь значения из заголовка электронной почты, как идентификатор сообщенияиспользование переменного с Grep

Grep не правильно использовать предыдущие переменный ...

Вот мой код:

for email in $1/*.eml 
do 

MSGID=$(cat ${email} | grep -i 'Message-ID:' |awk '{print $2}') 
M=$(echo "\""${MSGID}"\"") 
SRV="/var/log/maillog" 
echo "${M}" 

VER=$(grep -i ${M} ${SRV} | tail -n 1) 
echo ${VER} 
done 

Я пытаюсь повторно инкапсулировать начальную переменную MSGID с переменной M; К сожалению, я все еще не мог понять это.

Начальное значение (вход) выглядит следующим образом:

Message-ID: <[email protected]> 

MSGID оставить только строку как:

<[email protected]> 

Тогда я хотел бы использовать эту строку на файл с помощью grep. К сожалению, команда VER ничего не запускает.

Я думал, что добавление "\""${MSGID}"\"" должно было/должно содержать исходную строку без изменений.

+0

В этом скрипте много избыточных шагов. Пожалуйста, отредактируйте свой вопрос, чтобы предоставить образец вашего ввода и желаемый результат. –

+0

Пожалуйста, покажите некоторый файл ввода вместе с ожидаемым результатом. Возможно, это не значит, что ваш текущий скрипт является отправной точкой, поскольку, например, 'awk' может обрабатывать это способом прямолинейным способом. – fedorqui

+0

Вероятно, 'MSGID = $ awk '/^Message-ID:/{print $ 2}' file)' будет быстрее. Кроме того, примечание 'SRV' может быть объявлено вне цикла' for', так как это фиксированное значение. – fedorqui

ответ

0

Попробуйте это решение

M="\""$MSGID"\"" 
2

Это не совсем понятно, что вы пытаетесь достичь, но только удалив странные вещи упрощает в сценарий, который может помочь вам закончить вашу задачу.

SRV="/var/log/maillog" 
for email in $1/*.eml; do 
    M=$(awk 'tolower($0) ~ /message-id:/ {print $2}' "$email") 
    echo "$M" 
    grep -i "$M" "$SRV" | tail -n 1 
done 

У этого есть ряд проблемных угловых случаев. Экстракцию Message-Id, вероятно, следует быть строже:

M=$(awk 'tolower($1) ~ /^message-id:/ { print $2 } /^$/ { exit(0) }' "$email") 

и если извлеченный Message-Id содержит регулярное выражение метасимволы, вы должны избавиться от них, или, возможно, использовать соответствующие grep флаги:

grep -iF "$M" "$SRV" | tail -n 1 

быть уверены, , двойные кавычки в grep "$string" file не являются частью синтаксиса для grep; они отбрасываются оболочкой до запуска grep и полезны для предотвращения взаимодействия оболочки с пробелами пробела и/или оболочки метаданных в значении $string. Когда вы вынуждаете другую пару двойных кавычек, вы были grepping для идентификатора сообщения внутри буквенных двойных кавычек в файле журнала и (конечно) не находили.

+1

Я не знаю функцию 'lc'() в' awk'. В нижнем регистре вы, вероятно, хотите использовать 'tolower()'. Обратите внимание, что вы также можете сказать 'IGNORECASE = 1' в блоке' BEGIN {} '. – fedorqui

+1

Правильно, дух, спасибо! – tripleee

0

Спасибо всем. И жаль.

Я понял, что в моем первоначальном значении было возвращено каретки.

Я изменил это так:

MSGID=$(cat ${email} | grep -i 'Message-ID:' |awk '{print $2}' tr -d '\r') 

Еще раз спасибо.

Смежные вопросы