Мне нужно получить количество тегов, например "103=16", найденных во многих файлах, сколько их, но только файлы, которые имеют одно или несколько вхождений
Я использую:
find . /opt/FIXLOGS/l51prdsrv\* -iname "TRADX\_*oe*.log" -type f -exec grep -F 103=16 -c {} /dev/null ;
который находит файл, в котором находится тег, и показывает количество совпадений, но также показывает 0 вхождений
возвращается
файл1.лог:0
файл2.лог:0
файл3.лог:6
файл4.лог:0
использование -i для исключения 0 или grep -v :0 у меня не сработало, получается результат:
grep: :0: Нет такого файла или каталога
Как я могу получить только те файлы, в которых количество больше 0?
Я вообще не понимаю вашего вопроса, но я думаю, что вам может понадобиться grep -m1
, который уходит после первого матча.
Спасибо за ваш отзыв, в конце концов, сработало find . -type f -iname "TRADX_oe.log" -exec grep -cFH "103=16" {} \; | grep -v ":0"
Вы пытались подключиться к grep, чтобы свести на нет те, у которых есть нули после find/exec?
Например, как это работает для меня:
find . -type f -iname "TRADX_oe.log" -exec grep -cFH "103=16" {} \; | grep -v ":0"
Это сработало отлично, я попытался подключить его, но проблема заключалась в том, что я делал это за ; и не ставить 0 в кавычки. Спасибо
Использование awk
, чтобы делать все в одном месте
find . -type f -iname "TRADX_oe.log" -exec awk '/103=16/{c++} END { if (c)print FILENAME, c}' {} \;
Это тоже сработало, это то, что я не знал, что могу использовать, спасибо!
Вот как работает опция -c
grep:
-с, --количество Подавить нормальный вывод; вместо этого напечатайте количество совпадающих строк для каждого входного файла. С -v, --invert-match вариант (см. ниже), считать несовпадающие строки.
Таким образом, он напечатает 0 счетчиков, единственный вариант — удалить 0 с помощью другого grep, используя -v
, или использовать awk:
awk '/search_pattern/{f[FILENAME]+=1} END {for(i in f){print i":"f[i]}}' /path/to/files*
Это сработало, когда я передаю grep после ; исключая ноль | grep -v ":0"
заканчивая так:
находить . route -iname "TRAD_oe.log" -type f -exec grep -cHF "103=16" {} ; | grep -v ":0"
Я рекомендую посетить помощь по редактированию, чтобы ваш ответ можно было правильно отформатировать.
Это работает?
find . /opt/FIXLOGS/l51prdsrv* -iname "TRADX_oe.log" -type f -print0 | xargs -0 grep -F 103=16 -c | grep -v ':0$'