"locate" 명령의 결과에 따라 어떻게 조치를 취할 수 있나요?

"locate" 명령의 결과에 따라 어떻게 조치를 취할 수 있나요?

파일이 꽤 많지만 ' 파일 check_dns에 정의된 위치를 찾으려고 합니다 .nagioscommands.cfg

일치하는 항목을 검색하는 것과 같은 작업을 실행할 수 있다는 것을 알고 있지만 가능하다면 색인된 복사본이고 훨씬 빠르기 때문에 find / -name "command.cfg" -exec grep check_dns {} \;사용하고 싶습니다 .locate

실행하면 locate commands.cfg다음과 같은 결과를 얻습니다.

/etc/nagios3/commands.cfg
/etc/nagiosgrapher/nagios3/commands.cfg
/usr/share/doc/nagios3-common/examples/commands.cfg
/usr/share/doc/nagios3-common/examples/template-object/commands.cfg
/usr/share/nagiosgrapher/debian/cfg/nagios3/commands.cfg
/var/lib/ucf/cache/:etc:nagiosgrapher:nagios3:commands.cfg

각 결과를 xargs얻을 수 있도록 찾기를 실행하고 이를 인라인 명령이나 다른 것으로 파이프할 수 있습니까 ? grepfor 루프를 사용하여 이 작업을 수행할 수 있다는 것을 알고 있지만 여기서는 이 특정 경우에 대해 수행하는 방법보다 더 많은 bash-fu / shell-fu를 선택하려고 합니다.

답변1

xargs예, 이에 사용할 수 있습니다 .

예를 들면 다음과 같습니다.

$ locate commands.cfg | xargs grep check_dns

( grep여러 파일을 볼 때 각각에서 검색하고 일치하는 파일 이름 인쇄를 활성화합니다.)

또는 다음을 통해 명시적으로 파일 이름 인쇄를 활성화할 수 있습니다.

$ locate commands.cfg | xargs grep -H check_dns

(단 하나의 grep인수가 1개만 호출되는 경우를 대비해 xargs)

( 와 달리) 하나의 파일 이름 인수만 허용하는 프로그램의 경우 grep다음과 같이 제공되는 인수 수를 제한할 수 있습니다.

$ locate commands.cfg | xargs -n1 grep check_dns

일치하는 줄이 있는 파일의 이름은 인쇄되지 않습니다.

결과는 다음과 같습니다.

$ locate commands.cfg | xargs grep -h check_dns

최신 Locate/xargs를 사용하면 공백 문제로부터도 보호할 수 있습니다.

$ locate -0 commands.cfg | xargs -0 grep -H check_dns

(기본적으로 공백은 입력을 구분합니다 xargs. 이는 물론 파일 이름에 공백이 포함된 경우 문제가 됩니다...)

관련 정보