가끔 splunk로 쿼리를 사용하다보면.. 특히 saved search를 제작할 때에 for문을 돌리고 싶다는 생각이 든다. 정확히 쿼리에 for문을 사용한다는 것 자체가 애매한 표현이기는 하지만, 반복적인 행위를 쿼리 내에서 수행할 수 있는 방법이 있다. 사용하는 방법은 map 커맨드와 foreach 커맨드를 사용하는 것 이다.
두가지는 차이점이 있다. 오늘은 2가지 커맨드에 대해 알아본다.
먼저 글로써 간단하게 요약하면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에서 그대로 변수처럼($사용) 사용한다. 변수에는 쿼리의 결과가 끝날때까지 모두 대입된 후 결과가 나오게 된다.
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이 쓰일 것 이다.
foreach에서는 독특한 옵션을 제공하는데 그중에 하나가 <<FIELD>>
이다. 위에서 봤던 대로, 반복 인자를 담아주는 임시 변수 역할을 해준다. 그 외에는 아래와 같은 옵션이 있다.
test*
이 test1, test2, test3 이 될 수 있고 여기서 와일드 카드에 해당되는 부분이 각각 1,2,3 이기 때문이다. | makeresults
| eval test1=100, test2=200, test3=300, total=0
| foreach test*
[ eval new_<<MATCHSTR>>=<<FIELD>> + <<MATCHSTR>>]
| makeresults
| eval test5sid5foo1=100, test2sid2foo1=200, test3sid3foo1=300, total=0
| foreach test*sid*foo*
[ eval new_<<MATCHSEG2>>=<<FIELD>> + <<MATCHSTR>>]
외에도 많은 예시가 splunk 공식 문서에 있다. JSON에 값 추가, 라이선스 사용량 합계, 평균 내기 등등에 사용되는 것 같다.
필요한 사람은 공식 문서를 참고하길 바란다!