Splunk map, foreach 사용법

Munang·2023년 1월 16일
3

splunk

목록 보기
27/52

가끔 splunk로 쿼리를 사용하다보면.. 특히 saved search를 제작할 때에 for문을 돌리고 싶다는 생각이 든다. 정확히 쿼리에 for문을 사용한다는 것 자체가 애매한 표현이기는 하지만, 반복적인 행위를 쿼리 내에서 수행할 수 있는 방법이 있다. 사용하는 방법은 map 커맨드와 foreach 커맨드를 사용하는 것 이다.

두가지는 차이점이 있다. 오늘은 2가지 커맨드에 대해 알아본다.

1. map

1) 사용법

먼저 글로써 간단하게 요약하면map 커맨드는 미리 검색 결과를 나오게 한 후에, 해당 검색 결과를 변수로 사용하여 map 커맨드의 인자로 들어가는 쿼리문에 적용해준다.

바로 예시를 들어보자. 다음과 같은 쿼리문이 있다고 한다.

index=main 
| head 4 
| table city_name, country_id

쿼리의 결과는 다음과 같다.

우리는 위에 나온 4가지의 결과 값을 map커맨드에 적용할 것 이다.

index=main 
| head 4 
| table city_name, country_id 
| map search="search index=main city_name=$city_name$, country_id=$country_id$
| stats c by city_name, country_id"

이렇게 map커맨드를 사용했다고 하면, 동작하는 방식을 직관적으로 그림으로 그리면 다음과 같다.

다음과 같이 첫번째 쿼리의 결과로 나온 값을 map search에서 그대로 변수처럼($사용) 사용한다. 변수에는 쿼리의 결과가 끝날때까지 모두 대입된 후 결과가 나오게 된다.

2) 주의할 점

  • 기존에 search 결과로 받은 데이터를 활용하는 커맨드이기 때문에 데이터 셋 처리 커맨드이다.
  • append, appendpipe 뒤에는 map 커맨드를 사용할 수 없다. (직접 확인해보니 바로 뒤에 붙일 경우 사용이 어렵고 전체 쿼리에서 결합하여 사용하는 것은 가능했다.)

  • 대시보드에서 map커맨드 변수를 적용할 때에는 $를 더블로 사용하면 된다.

2. foreach

1) 사용법

foreach 커맨드는 마치 for문과 같은 행위를 가능하게 한다. 처음에 보면 <<>> 이런 문구가 있어서 쿼리문이 좀 난해하게 보이는데, 그림으로 설명하면 바로 이해가 갈 것이다.

| makeresults 
| eval test1=100, test2=200, test3=300, total=0 
| foreach test1, test2, test3 
    [ eval total=total+<<FIELD>>]

이러한 쿼리가 있다고 하자. 그러면 다음과 같이 동작하게 된다.

python의 for문으로 표현해봤다. foreach의 인자로 쓰인 3가지의 변수는 반복하려는 대상이 되고, 한 번씩 반복할 때마다 FIELD에 들어가서 하위 검색을 수행하게 된다. for문의 반복할 인자를 담아줄 임시 변수가 FIELD로 표현됐다고 생각하면 된다.


이렇게 그림처럼 동작하게 되는 것 이다.

| makeresults 
| eval test1=100, test2=200, test3=300, total=0 
| foreach test1, test2, test3 
    [ eval <<FIELD>>=<<FIELD>>/60]

다른 쿼리도 작성해봤다. 결과는 예상대로 다음과 같다. 연산과정은 직접 상상해보시길 바란다.

| makeresults 
| eval test1=100, test2=200, test3=300, total=0 
| foreach test* 
    [ eval <<FIELD>>=<<FIELD>>/60]

반복인자가 되는 변수를 와일드 카드를 사용해 전체적으로 사용할 수도 있다. 위의 경우에는 test1, test2, test3이 쓰일 것 이다.

2) 옵션

foreach에서는 독특한 옵션을 제공하는데 그중에 하나가 <<FIELD>> 이다. 위에서 봤던 대로, 반복 인자를 담아주는 임시 변수 역할을 해준다. 그 외에는 아래와 같은 옵션이 있다.

  • MATCHSTR
    반복 인자에서 와일드 카드에 매칭되는 부분만을 가져와서 문자열로 대체 해준다.
    아래의 쿼리의 경우에는 MATCHSTR이 각각 1,2,3 이다. test*이 test1, test2, test3 이 될 수 있고 여기서 와일드 카드에 해당되는 부분이 각각 1,2,3 이기 때문이다.
| makeresults 
| eval test1=100, test2=200, test3=300, total=0 
| foreach test* 
    [ eval new_<<MATCHSTR>>=<<FIELD>> + <<MATCHSTR>>]

  • MATCHSEG1,2,3
    반복 인자에서 와일드 카드에 매칭되는 첫 번째, 두 번째, 세 번째 부분을 가져와서 문자열로 대체 해준다.
| makeresults 
| eval test5sid5foo1=100, test2sid2foo1=200, test3sid3foo1=300, total=0 
| foreach test*sid*foo*
    [ eval new_<<MATCHSEG2>>=<<FIELD>> + <<MATCHSTR>>]

외에도 많은 예시가 splunk 공식 문서에 있다. JSON에 값 추가, 라이선스 사용량 합계, 평균 내기 등등에 사용되는 것 같다.

필요한 사람은 공식 문서를 참고하길 바란다!

profile
Moonlilght

0개의 댓글