grep: Какие * шаблоны * совпадают, а не какой текст?

Наконец, вот решение:

cat $type"_"$NAME_DIR"_"$d"_"$2"_"$1".tar.gz."* > $type"_"$NAME_DIR"_"$d"_"$2"_"$1".tar.gz"

Я не экранировал * и поместил его вне "". Спасибо Archemar за его ответ. Он помог мне найти ошибку.

3
11.08.2017, 02:03
4 ответа

Для каждого шаблона:

if ! grep -q "$pattern" /path/to/input; then
    echo "/${pattern}/ not found."
fi

Это, насколько мне известно, единственный способ сделать это, потому что, если вы ищете несколько шаблонов одновременно, вы будете знать только, что вы сопоставили по крайней мереодин из их. Вы можете попробовать, если у вас есть много логических ИЛИ (например, /(needle|pin)/, начиная с простого повторения каждой из этих перестановок, но вам все равно придется проверять по одному выражению за раз.

1
27.01.2020, 21:13

Вы можете использовать awk, регулярные выражения которого очень похожи на grep -Es:

awk '!patterns_read{patterns[$0]; next}
     {for (p in patterns) if ($0 ~ p) c[p]++}
     END {
       for (p in patterns) printf "'%s' was matched %d times\n", p, c[p]
     }' patterns patterns_read=1 log files
3
27.01.2020, 21:13
perl -lne '
   # read in the patterns into a hash
   @ARGV and $h{$_}=s|/|\\/|gr,next;

   # delete pattern if matched, so we wont have to
   # expend efforts on it for the subsequent lines
   while (my($pat) = each %h) {
      delete $h{$pat} if /$h{$pat}/;
   }

   # what remains are those that did not match
   END {
      print "These patterns did not match:";
      print for keys %h;
   }
' patterns_file log_file
1
27.01.2020, 21:13

В зависимости от того, насколько сложны RE, вы можете использовать такой язык, как Python (непроверенный):

#! /usr/bin/env python3
import re, sys
res = ["re1", "re2",... ]  # or read from a file
recs = [re.compile(r) for r in res]
matches = {}
for line in sys.stdin:
    for r in recs:
        if r.match(line):
            matches[r] += 1
for r in matches:
    if matches[r] == 0:
        print(r.pattern)

Конечно, если регулярные выражения содержат строки, которые не могут быть восприняты буквально более продвинутой поддержкой регулярных выражений Python, это не сработает. Вероятно, вы могли бы избавиться от большого количества работы, передав вывод grepэтому (, так как тогда мы удаляем строки, в которых нет совпадений с регулярным выражением ).

1
27.01.2020, 21:13

Теги

Похожие вопросы