Seongwon Lim

[Python] 문자열 파싱 라이브러리 - Pygrok 설치 및 사용 방법 본문

Python

[Python] 문자열 파싱 라이브러리 - Pygrok 설치 및 사용 방법

limsw 2023. 4. 14. 16:48
반응형

서론

이번 글에서는 파이썬 내 라이브러리를 이용하여 복잡한 문자열을 처리할 수 있는 기능을 간단하게 구현해보고자 한다.

 

ELK 스택(Elasticsearch + Logstash + Kibana)를 알고 있는 사람이라면 로그스태시의 Grok Parser 기능을 들어보거나 사용해본 사람들이 있을 것이다. Grok Parser는 로그스태시 내에서 사용되며, 복잡하게 구성된 로그들을 사용자가 정의한 정규 표현식에 맞추어서 키:값 형태로 추출해주는 기능을 제공한다.

 

이번에 다루는 Pygrok 라이브러리도 로그스태시의 Grok Parser 기능과 동일한 기능을 제공한다고 생각하면 좋을 것 같다.

설치하기

pip install pygrok

위 명령어를 이용하여 Pygrok을 설치한다.

예제 코드

text = 'gary is male, 25 years old and weighs 68.5 kilograms'

다음과 같은 코드가 있을 때, 유의미한 데이터를 추출하고자 한다면 이름, 성별, 나이, 몸무게 정도가 될 수 있다.

따라서 4개의 속성을 추출하고 싶다면 다음과 같이 pygrok 코드를 정의할 수 있다.

 

from pygrok import Grok
pattern = '%{WORD:name} is %{WORD:gender}, %{NUMBER:age} years old and weighs %{NUMBER:weight} kilograms'

grok = Grok(pattern)
print grok.match(text)

# {'gender': 'male', 'age': '25', 'name': 'gary', 'weight': '68.5'}

사용 방법을 살펴보면,

%{} 안에 패턴을 정의하며 안에 순서는 타입:추출변수명을 순서대로 작성하여 패턴을 정의할 수 있다.

 

따라서, 위와 같이 패턴을 정의하고 Grok 객체 생성 후 text 변수를 해당 패턴에 적용하면 위와 같은 딕셔너리 형태의 결과를 확인할 수 있다.

 

  • 만약 나이(age)와 몸무게(weight)의 값을 문자열 형태가 아니라 각각 정수(int),실수(float)으로 반환하고 싶다면
    NUMBER:age:int 그리고 NUMBER:weight:float 으로 사용하면 된다.

 

또한, 값이 존재하지 않는 경우를 예외처리 하고 싶을 땐 물음표(?)를 사용하여 코드를 작성하면 된다. 예를 들어,

text = 'gary is , 25 years old and weighs 68.5 kilograms'

위처럼 성별에 대한 값이 없는 경우를 가정한다면, 다음과 같이 코드를 정의할 수 있다.

#%{} 뒤에 물음표(?)를 추가한다.
pattern = '%{WORD:name} is %{WORD:gender}?, %{NUMBER:age} years old and weighs %{NUMBER:weight} kilograms'

grok = Grok(pattern)
print(grok.match(text))

# {'name': 'gary', 'gender': None, 'age': '25', 'weight': '68.5'}

물음표를 붙이지 않는 경우에는 반환 데이터 자체가 None을 반환하지만, 다음과 같이 없는 데이터에 대해서 예외 처리를 적용하면 해당 키에 대한 데이터만 None 으로 반환한다.

 

pygrok에서 사용할 수 있는 타입 종류와 사용 방법은 아래 링크를 참고하면 좋을 것 같다.

 

GitHub - garyelephant/pygrok: python implementation of jordansissel's grok regular expression library

python implementation of jordansissel's grok regular expression library - GitHub - garyelephant/pygrok: python implementation of jordansissel's grok regular expression library

github.com

결론

로그 수집/분석에 대한 중요도가 갈수록 높아지고 있는 만큼,

로그를 효율적으로 처리할 수 있는 방안들을 지속적으로 공부할 예정이다.

Comments