Почему 'grep -q' использует весь входной файл?

попробуйте

 awk 'NR == 1 {maxi=$1;} 
      {for(i=1;i<=NF;i++) if ($i > maxi) maxi=$i ;} 
      END { print maxi;}' file

где

  • NR == 1 предложение инициализируется для максимального значения первой строки первым полем.
  • NF устанавливается для каждой строки на номер поля
  • Я предполагаю, что ваше поле пустое / разделено табуляцией, вы можете использовать FS = "," или FS = ";" в предложении BEGIN {} .
  • всю команду можно поместить в одну строку, я использую несколько строк для удобства чтения.
23
25.01.2017, 16:15
3 ответа

grep действительно останавливается раньше, но он буферизует свой ввод, поэтому ваш тест слишком короткий (и да, я понимаю, что мой тест несовершенный поскольку он не доступен для поиска):

seq 1 10000 | (grep -q 2; cat)

начинается с 6776 в моей системе. Это соответствует буферу 32 КБ , используемому по умолчанию в GNU grep:

seq 1 6775 | wc

output

   6775    6775   32768

Обратите внимание, что POSIX упоминает только улучшения производительности

При поиске в нескольких файлах

Это не оправдывает ожиданий. для повышения производительности за счет частичного чтения одного файла.

37
27.01.2020, 19:41

Вы путаете команды sed и grep.

Для команды sed -2q говорит, что нужно выйти из текущей итерации, если во второй строке параметр -n говорит, что нужно работать тихо, поэтому вы получите все строки после 2-го.

Команда grep запускается по умолчанию для вывода всех совпадающих строк, но параметр -q говорит, что ничего не выводить в стандартный вывод. поэтому, если вход содержит «2», он будет иметь значение выхода УСПЕХ, в противном случае НЕИСПРАВНОСТЬ. Что это такое, зависит от вашей операционной системы и оболочки. Итак, обычно вы можете определить, совпадает ли строка, исследуя значение выхода процесса grep. Это полезно в конвейере, когда вы хотите знать, содержит ли ваш ввод какое-либо значение в качестве теста. Например.

if grep -q 'crash' <somelog.log ; then report_crash_via_email ; fi

В этом случае нам действительно не нужно видеть все совпадающие строки, нам просто важно, существует ли хотя бы одна. Затем процесс / функция report_crash_via_email может отключиться и повторно открыть файл или нет.

Если вы хотите, чтобы ваш процесс grep останавливался после того, как он нашел символ «2» - он не будет по умолчанию, он будет проверять каждую строку, чтобы увидеть, соответствует ли она - вам нужно сказать ему, чтобы он сделал это. Ключ командной строки для этого - -m <значение> . Итак, в вашем случае grep -q -m1 2 .

1
27.01.2020, 19:41

Очевидно, это связано с буферизацией, которую grep делает для ускорения работы . Существуют инструменты, специально разработанные для чтения любого количества символов, но не более. Один из них - expect :

{ expect -c "log_user 0; expect 2"; cat; } < infile

У меня нет системы, чтобы попробовать это, но я считаю, что ожидаю, что съест все, пока не встретит ожидаемую строку ( 2 ), а затем завершить, оставив остальную часть ввода для cat .

2
27.01.2020, 19:41

Теги

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