로그 파일에서 파일 경로를 추출하는 정규식

로그 파일에서 파일 경로를 추출하는 정규식

로그 파일에서 파일 경로를 가져와야 합니다. 나는 이것을 정규식으로 시도해 볼 것이라고 생각했습니다.

파일 경로는 다음과 같습니다.

75/751234/751234V0001_test-tag1-tag02-75x75_01.jpg

저는 정규식 전문가가 아니므로 다음 표현식을 사용해야만 두 번째 슬래시에 도달할 수 있습니다. 또한 정규식을 통해 파일 이름의 시작 부분을 가져오지만 다음 몇 가지 키워드는 가져올 수 없습니다.

([0-9]{2})[\/]([0-9]{2,10})[\/]

이제 실제 파일 이름에 대한 정규식이 여전히 누락되었습니다. 파일 이름은 항상 숫자로 시작됩니다. 그 이후에는 이론적으로 무제한의 키워드가 있을 수 있습니다.

파일 확장자는 .jpg, .tif, .zip 등이 될 수 있습니다.

따라서 출력은 파일 경로여야 합니다.

75/751234/751234V0001_test-tag1-tag02-75x75_01.jpg

어쩌면 누군가가 지금까지 가지고 있는 정규식에 대한 해결책이나 개선 사항을 가지고 있을 수도 있습니다.

답변1

파일 경로는 다음과 같이 구성되어 있는 것으로 보입니다.

  • 파일 이름은 여러 숫자로 시작됩니다.
  • 경로는 번호의 처음 두 자리가 포함된 디렉터리로 시작됩니다.
  • 전체 번호를 포함하는 하위 디렉터리로 계속됩니다.
  • 문제의 파일은 이 하위 디렉토리에 직접 위치하며 위의 번호로 시작하는 것 외에도 제한된 가능성의 확장자를 가지고 있습니다.

파일 이름이 포함된 줄을 식별하는 다른 방법이 있는 경우 이 방법이 더 나을 수 있습니다. 파일 이름의 패턴이 다양하고 표시된 패턴에 초점을 맞추려면 다음 정규식이 작동해야 합니다( grepERE 모드에서 GNU를 사용하는 예).

grep -E -w -o '([[:digit:]]{2})/(\1[[:digit:]]+)/\2[^[:digit:]][^/]*\.(jpg|tif|zip)' logfile.txt

이는 역참조( \1\2)를 사용하여 "동일한 텍스트"가 문자열의 다른 위치에서 일치하는지 확인합니다.

  • 문자열은 두 자리 숫자와 슬래시로 시작해야 합니다.
  • 그런 다음 시작과 동일한 두 자리 숫자, 그 뒤에 지정되지 않은 숫자(숫자에 고정 범위가 있는 경우 대체 가능) 및 슬래시가 와야 합니다 + .{2,10}
  • 그런 다음 두 번째 경로 요소와 동일한 번호로 시작하고 그 뒤에숫자가 아닌 문자(숫자가 실제로 두 번째 경로 요소와 동일한지 확인하기 위해) 및 /(하위 디렉터리의 파일을 제외하거나 동일한 줄에 여러 파일 경로가 포함되는 것을 방지하기 위해)를 제외하고 최종 대체 파일 확장자( 필요에 따라 확장 수를 조정할 수 있습니다).
  • -o옵션을 사용하면 행에서 일치하는 부분(예: 파일 경로)만 반환됩니다. 이 -w옵션을 사용하면 결과가 전체 문자열, 즉 잠재적으로 더 긴 파일 경로의 하위 문자열과 일치하지 않도록 합니다. 이를 위해서는 파일 이름에 공백(파일 이름에 유효한 문자)이 포함되어서는 안 됩니다.

엄밀히 말하면 역참조는 기본 정규식에서만 작동하도록 보장되는 기능인 반면 재정의는 확장 정규식에서만 작동하도록 보장됩니다. GNU grep확장 정규식은 역참조를 허용하므로 이 경우에는 작동합니다(아마도 그다지 큰 제한은 아닐 것입니다).

관련 정보