![grep 값으로 find 명령에서 일치 항목을 집계하는 방법은 무엇입니까?](https://linux55.com/image/225209/grep%20%EA%B0%92%EC%9C%BC%EB%A1%9C%20find%20%EB%AA%85%EB%A0%B9%EC%97%90%EC%84%9C%20%EC%9D%BC%EC%B9%98%20%ED%95%AD%EB%AA%A9%EC%9D%84%20%EC%A7%91%EA%B3%84%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
<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
).
사용
-exec \;
find ./vendor/magento/ -type f -path '*/etc/adminhtml/system.xml' \ -exec grep -P "<source_model>.*</source_model>" {} \;
grep
GNU( Linux 시스템의 기본값) 를 사용하는 경우 이-h
플래그를 사용하여 파일 이름 인쇄를 억제하도록 지시 할 수 있습니다.find ./vendor/magento/ -type f -path '*/etc/adminhtml/system.xml' \ -exec grep -hP "<source_model>.*</source_model>" {} +
물론, 이 모든 것을 지원하는 구현을 사용하는 경우 해당 플래그 grep
도 필요할 수 있으므로 행에서 일치하는 부분만 인쇄됩니다.-o
grep