Регистронезависимый exiqgrep?

Моя почтовая очередь в настоящее время заполнена сообщениями об отказе для того же домена, но в смешанном регистре.

Я пытался с помощью exiqgrep чтобы отфильтровать эти письма из моей очереди, но, похоже, команда чувствительна к регистру. Есть ли способ выполнить поиск без учета регистра?

2 ответа

Решение

Как отметил другой джентльмен, программа exiqgrep - это всего лишь скрипт на Perl. Он принимает необработанное значение, переданное функции -r (получателю), и использует его в сопоставлении с образцом. Сопоставление с образцом является простым $rcpt =~ /$opt{r}/ perl test, совпадение по умолчанию, так как оно не указано, чувствительно к регистру.

Как и все Perl, TIMTOWTDI (Есть больше, чем один способ сделать это). Поскольку вышеприведенная функция не удаляет и не очищает значение, переданное в -r, вы можете просто встроить модификатор case игнорирования в регулярное выражение. Увидеть perldoc perlre для получения более подробной информации о том, как (?MODIFIERS:...) последовательность работает.

Вот пример, где я показываю, что при поиске в смешанном регистре не удается найти искомый домен, но, используя встроенный модификатор флага как часть поискового запроса, он находит его.

OVZ-CentOS58[root@ivwm51 ~]# exiqgrep -r 'crazyivan@yahoo.com'
26h  4.0K 1VGRud-0001sm-P1 <> *** frozen ***
      crazyivan@yahoo.com

OVZ-CentOS58[root@ivwm51 ~]# exiqgrep -r 'crazYivAn@yahOo.com'
OVZ-CentOS58[root@ivwm51 ~]# exiqgrep -r '(?i:crazYivAn@yahOo.com)'
26h  4.0K 1VGRud-0001sm-P1 <> *** frozen ***
      crazyivan@yahoo.com

Ваш поиск будет похож на что-то вроде:

(?i:@thedomainyouseek.com)

Manpage не показывает такую ​​опцию, но exiqgrep Утилита это perl скрипт, источник которого вы можете изменить в соответствии со своими потребностями:


114 sub selection() {
115   foreach my $msg (keys(%id)) {
116     if ($opt{f}) {
117       # Match sender address
118       next unless ($id{$msg}{from} =~ /$opt{f}/); # here
119     }
120     if ($opt{r}) {
121       # Match any recipient address
122       my $match = 0;
123       foreach my $rcpt (@{$id{$msg}{rcpt}}) {
124         $match++ if ($rcpt =~ /$opt{r}/); # or here
125       }
126       next unless ($match);
127     }
128     if ($opt{s}) {
129       # Match against the size string.
130       next unless ($id{$msg}{size} =~ /$opt{s}/);
131     }
132     if ($opt{y}) {
133       # Match younger than
134       next unless ($id{$msg}{ages}  $opt{o});
139     }
140     if ($opt{z}) {
141       # Exclude non frozen
142       next unless ($id{$msg}{frozen});
143     }
144     if ($opt{x}) {
145       # Exclude frozen
146       next if ($id{$msg}{frozen});
147     }
148     # Here's what we do to select the record.
149     # Should only get this far if the message passed all of
150     # the active tests.
151     $id{$msg}{d} = 1;
152     # Increment match counter.
153     $mcount++;
154   }
155 }
Другие вопросы по тегам