Эквивалент GREP для ОС Windows через скрипт Python

#python-3.x #windows #batch-file #cmd #grep

#python-3.x #Windows #пакетный файл #cmd #grep

Вопрос:

Пожалуйста, может кто-нибудь помочь мне с альтернативой для Windows следующей команде:

Версия Linux: найдите Win32_EXE -введите f -name ‘*.json’ -exec grep —files-with-match -i ‘dbtool’ ‘{}’ ;

Версия для Windows: FIND / i «dbtool» Win32_EXE *.json

Проблема: в синтаксисе Windows отсутствует опция, позволяющая мне указать, что я хочу, чтобы результат возвращался при первом совпадении.

Комментарии:

1. Обязательно ли это должен быть Python или вы можете использовать powershell?

2. В этом случае он должен быть таким, чтобы он запускался через скрипт python.

Ответ №1:

В python я бы использовал рекурсивный глобус:

 from glob import iglob

def search(file):
    with open(file) as fo:
        for line in fo:
            if "dbtool" in line.lower():
                return True
    return False

for file in iglob("Win32_EXE/**/*.json", recursive=True):
    if search(file):
        print(file)
  

но я думаю, что в целом я бы не стал использовать Python — другие решения, вероятно, быстрее / лучше.
например, Powershell

 get-childitem -recurse *.json | where-object { select-string -quiet -pattern "dbtool" -path $_ }
  

или, если вы можете установить ripgrep, это работает хорошо.

 rg -l -g "*.json" -i dbtool Win32_EXE
  

Ответ №2:

Это приведет к поиску файлов * .json и поиску в них строки dbtool . Измените каталог PUSHD на свой каталог поиска.

 PUSHD "C:srct"
FOR /F "delims=" %%A IN ('DIR /S /B /A:-D "*.json"') DO (
    FIND /I "dbtool" "%%~A"
)
POPD