스플렁크에서 search 명령어는 가장 기본적인 명령어로 근본적으로는 where와 같은 필터링 명령어로 볼 수 있다.
search는 검색창에 아무 명령어를 넣지 않아도 기본적으로 들어가는 기본 명령어다.
따라서
sourcetype=값1 host=호스트이름
위와 같은 구문을 검색창에 넣어서 실행하면 정상적으로 실행되지만
|search sourcetype=값1 host=호스트이름
실제로는 위와 같은 구문이 실행된다.
하지만 해당 기능은 쿼리의 맨 앞에서만 적용되므로, 이미 나온 검색결과의 필터링을 위해 쿼리 뒷부분에 붙일 때는 search를 명시해야한다.
보통은 기본적으로 처음부터 search 명령어가 들어가기 때문에 평소엔 그냥 그렇구나 하고 넘어갈 수 있지만,
외부에서 REST API를 통해 동작시키거나 리눅스에서 splunkd에 직접 명령을 내리는 등, 규격 외 방식으로 Splunk에서 검색을 실행할 때는 직접 추가해야하지 않으면 쿼리가 안 돌아가는 경우도 있다.
그러니 그냥 기억해뒀다가 쿼리가 제대로 안나오면 "혹시?" 생각해봄직한 사항이다.
search는 where 절보다 훨씬 더 검색/필터링 옵션이 자유롭다.
일단 where는 검색 결과가 이미 있는 쿼리 뒤에 붙여서 사용해야 하지만
search는 시작부터 사용해도 된다.
검색 결과가 없는 상태에서 사용하면 알아서 데이터를 조건에 맞춰 검색하기 때문이다.
조건도 훨씬 자유롭게 지정할 수 있다.
일단 where와 마찬가지로 AND를 사용할 필요가 없는 것도 소소한 장점이다.
sourcetype=값1 host=호스트이름
그러므로 위와 같은 쿼리는 실제 동작 구문이 다음과 같다는 뜻이다.
search sourcetype=값1 AND host=호스트이름
OR 조건을 사용할 경우 따로 명시해줘야 한다.
|search sourcetype=값1 (host=호스트이름1 OR host=호스트이름2)
|search sourcetype=값1 ((host=호스트이름1 OR host=호스트이름2) AND host != "원하지 않는 호스트 이름")
() 표시는 무조건 필수는 아니나, ((A OR B) OR C) 형식의 다차 조건문을 위해 사용하며,
AND 역시 굳이 명시할 필요는 없으나 가독성을 해친다고 생각한다면 명시해주는 것도 좋다.
비록 다차가 아니더라도 가독성을 위해 사용하는 것이 좋다.
검색 성능에 영향을 끼치지 않는다면 가독성 좋은 쿼리를 짜는 것을 지향하자.
where 절과 마찬가지로 search도 IN을 사용할 수 있다.
|search host IN ("호스트명1", "호스트명2","호스트명3")
|search NOT host IN ("호스트명1", "호스트명2","호스트명3")
search의 장점은 * 문자의 사용이 자유로워 키워드 검색이 무척 간편하다는 점이다.
|search host="*키워드*"
|search host="키워드*"
|search host=*
like()를 사용할 필요 없이 별표를 사용해 간편한 키워드 검색이 가능하며,
그냥 "컬럼명 = *"을 명시할 경우 전체를 검색할 수 있다.
search의 강력한 장점은 보조 검색을 통해 검색 결과를 조건으로 설정할 수 있다.
예를들어 2가지의 데이터를 갖고 있다고 생각해보자
host =제주할인마트
host=본사물품창고
제주할인마트가 보내오는 데이터는 다음과 같다.
품목, 판매수량
우유 , 1개
고구마, 3개
배추, 2개
본사 물품창고가 보내오는 데이터는 다음과 같다.
종류, 품목
축산물, 우유
농산물, 고구마
농산물, 배추
만약 제주할인마트의 판매 데이터 중,
농산물만 검색하고 싶다면 보조검색결과를 통해 조건을 설정할 수 있다.
|search host=제주할인마트 [|search host=본사물품창고 종류=농산물 | table 품목]
이 대괄호 안의 보조 검색 쿼리가 실행될 경우 데이터는 다음과 같이 나온다.
품목
고구마
배추
따라서 쿼리는 마치 다음과 같이 동작한다.
|search host=제주할인마트 품목 IN ("고구마","배추")
본사물품창고의 품목 정보가 바뀔때마다 일일히 제주 할인마트 검색 쿼리를 바꿀 필요 없이, 검색 결과를 통해 다중 조건 설정이 가능한 것이다.
주의할 점은 만약 위 보조검색 쿼리에서 "|table 품목" 명령어를 넣지 않을 경우
|search host=제주할인마트 [|search host=본사물품창고 종류=농산물]
보조 검색 결과는 다음과 같이 나온다
종류, 품목
농산물, 고구마
농산물, 배추
따라서 쿼리는 마치 다음과 같이 동작한다.
|search host=제주할인마트 종류 IN ("농산물") 품목 IN ("고구마","배추")
헌데 제주할인마트 데이터에는 '종류' 라는 컬럼명이 없어 결과는 나오지 않게된다.
그렇기 때문에 table 명령어로 조건으로 사용할 컬럼명만 이름을 맞춰서 사용하는 것이 중요하다.
혹시 서로 컬럼명이 다른 경우
|search host=제주할인마트 [|search host=본사물품창고 종류=농산물 |rename 물건이름 as 품목 | table 품목]
위와 같이 |rename 명령어를 이용해 이름을 제주할인마트에 맞춰서 검색해야 한다.
'Splunk Tech' 카테고리의 다른 글
Splunk 응용 - 통계 기능 stats, eventstats, streamstats (1) | 2023.02.23 |
---|---|
Splunk 기초 - 따옴표 제대로 이해하기 (0) | 2023.01.19 |
Splunk 기초 - Where 절의 효율적 사용 (0) | 2023.01.18 |