파일에서 특정 문자열은 포함하고 다른 문자열은 포함하지 않는 행을 찾으려면 find 및 grep을 사용하십시오.

파일에서 특정 문자열은 포함하고 다른 문자열은 포함하지 않는 행을 찾으려면 find 및 grep을 사용하십시오.

먼저 다음 코드를 시도합니다.

find . -name "*.cfg" | xargs grep "good"|grep -v "^\#"

현재 폴더에서 확장자가 "cfg"인 파일 이름 목록을 얻습니다. 그런 다음 "good"이 포함되어 있지만 "#"으로 시작하지 않는 줄의 콘텐츠를 검색하고 싶습니다. 하지만 내 코드가 작동하지 않습니다. 뭐가 문제 야? 감사해요.

답변1

사용할 쓸모 없는 xargs(검색 결과에 -exec가 있는 경우):

find . -name "*.cfg" -exec egrep "^[^#]*good" {} +

캐럿은 마스크될 필요가 없습니다. 어떤 상황에서 마스크되어야 하는지 모르겠습니다. 하지만 거기에는 아무런 해가 없습니다. 당신의 모든 명령이 나에게 효과적입니다.

답변2

다음과 같이 작동해야 합니다.

find . -name "*.cfg" -print0 | xargs -0 grep -E '^([^#].*|)good'

공백이 포함된 파일 이름 문제를 피하기 위해 전환했습니다 -print0.

그런 다음 단일 정규식을 포함 good하지만 시작하지 않는 행을 필터링합니다 . #왼쪽 대체( [^#].*)는 문자가 아닌 으로 시작하는 행과 일치하고 #, 오른쪽 대체(비어 있음)는 로 시작하는 행과 일치하도록 허용합니다 good.

귀하의 질문에 두 개가 아닌 단일 정규식을 사용하면 GNU grep이 파일 이름을 인쇄하도록 할 수 있습니다(여러 파일이 제공되는 경우 이 작업을 수행합니다 find). 두 번째 단계를 추가하면 grep -v ^...파일 줄의 시작 부분과 일치하지 않습니다.

관련 정보