grep 값으로 find 명령에서 일치 항목을 집계하는 방법은 무엇입니까?

grep 값으로 find 명령에서 일치 항목을 집계하는 방법은 무엇입니까?

<source_model>.*</source_model>다음 위치에 있는 모든 파일을 찾고 있습니다 ./vendor/magento/*/etc/adminhtml/system.xml.

find ./vendor/magento/ -type f -path */etc/adminhtml/system.xml -exec grep -P "<source_model>.*</source_model>" {} +

그러나 출력은 다음과 같은 형식입니다.

./vendor/magento/module-authorizenet-cardinal/etc/adminhtml/system.xml:                        <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>

값을 추출하고 싶습니다.

<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<source_model>Magento\Captcha\Model\Config\Mode</source_model>
...

이렇게 하면 정리할 수 있어요. 어떻게 해야 하나요?

답변1

검색할 파일이 여러 개 주어지면 기본 동작은 grep출력의 각 줄에 파일 이름을 추가하는 것입니다. 따라서 이 출력이 표시되는 이유는 각 파일에 대해 개별적으로 명령을 실행하는 -exec ... +대신 파일을 그룹화하여 가능한 한 적은 수의 인스턴스를 시작하려고 시도하는 명령을 사용하고 있기 때문입니다 . -exec ... \;따라서 몇 가지 옵션이 있습니다(값 주위의 따옴표에 주의하십시오 -path. 그렇지 않으면 *쉘이 값을 보기 전에 확장할 것입니다 find).

  1. 사용-exec \;

     find ./vendor/magento/ -type f -path '*/etc/adminhtml/system.xml' \
        -exec grep -P "<source_model>.*</source_model>" {} \;
    
  2. grepGNU( Linux 시스템의 기본값) 를 사용하는 경우 이 -h플래그를 사용하여 파일 이름 인쇄를 억제하도록 지시 할 수 있습니다.

     find ./vendor/magento/ -type f -path '*/etc/adminhtml/system.xml' \
        -exec grep -hP "<source_model>.*</source_model>" {} +
    

물론, 이 모든 것을 지원하는 구현을 사용하는 경우 해당 플래그 grep도 필요할 수 있으므로 행에서 일치하는 부분만 인쇄됩니다.-ogrep

관련 정보