Если вы делаете это:
cat file.log | grep foo | grep bar
Вы печатаете только строки, которые содержат foo
и bar
в любом порядке.Если это ваше намерение:
grep -e "foo.*bar" -e "bar.*foo" file.log
Будет более эффективным, так как мне нужно только проанализировать вывод.
Обратите внимание, мне не нужен cat
, который более эффективен всам.Вам редко понадобится cat
, если вы не объединяете файлы (что и является целью команды).В 99% случаев вы можете либо добавить имя файла в конец первой команды в конвейере, либо если у вас есть такая команда, как tr
, которая не позволяет вам использовать файл, вы всегда можете перенаправить вводвот так:
tr `a-z` `A-Z` < $fileName
Но хватит о бесполезных cat
с.У меня их дома два.
Вы можете передать несколько регулярных выражений одному grep
, что обычно немного эффективнее, чем передать несколько greps
.Однако, если вы можете исключить регулярные выражения, вы можете найти это наиболее эффективным:
fgrep "foo" file.log | fgrep "bar"
В отличие от grep
, fgrep
не анализирует регулярные выражения, что означает, что он может анализировать строки намного, намного быстрее,Попробуйте это:
time fgrep "foo" file.log | fgrep "bar"
и
time grep -e "foo.*bar" -e "bar.*foo" file.log
И посмотрите, что быстрее.