grep для нескольких строк, но выводит только первое совпадение для каждой строки в списке

zgrep -f /onip/appt/app/yemi/usage_biglist.txt \
    /onip/cdr/output/nor/bac/filec/$count/nordat.gz \
    >> /onip/appt/app/yemi/have_usage.txt

Резюме

  1. выберите первую строку в файле usage_biglist. txt
  2. grep его из файла nordat.gz и сохраните результат в have_usage.txt
  3. выберите следующую строку в usage_biglist.txt и проделайте то же самое до nth string
-1
31.01.2017, 15:45
3 ответа

grep (или zgrep в вашем случае) всегда будет выводить все совпадающие строки из файла.

Вы можете выполнить сопоставление каждого шаблона индивидуально и передать результат через head -n 1 , хотя:

while read -r pattern; do
    zgrep "$pattern" file.gz | head -n 1
done <pattern_list.txt >output_file.txt

В вашем случае:

while read -r pattern; do
    zgrep "$pattern" /onip/cdr/output/nor/bac/filec/$count/nordat.gz | head -n 1
done </onip/appt/app/yemi/usage_biglist.txt >/onip/appt/app/yemi/have_usage.txt
1
28.01.2020, 05:08

Я бы использовал awk :

gunzip < "/onip/cdr/output/nor/bac/filec/$count/nordat.gz" |
  awk '
    !list_processed {strings[$0]; next}
    {
      do_print = 0
      for (s in strings)
        if (index($0, s)) {
          delete strings[s]
          do_print = 1
        }
    }
    do_print
  ' /onip/appt/app/yemi/usage_biglist.txt list_processed=1 - \
    >> /onip/appt/app/yemi/have_usage.txt
1
28.01.2020, 05:08

Используйте

zgrep -m 1 -f

вместо

zgrep -f
0
28.01.2020, 05:08

Теги

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