Splunk Search

Can one do less than greater than comparisons from fields in a lookup table?

beattiedb
New Member

I have a lookup table that is composed of beginning IP and ending IP addresses for a location and the name of the associated location.
A search returns the sourceIp of the splunkAgent that produced some data.
I want to determine what the location of the splunkAgent is by finding which of 20 or so possible IP ranges the sourceIp address falls in.
Can this be done and if so what does the command(s) look like to do the lookup and comparison?

0 Karma

woodcock
Esteemed Legend

You need to convert your lookup from beginning and ending IP addresses to CIDR ranges instead. Then you can create a lookup definition with CIDR(<your field name here) on that field name and match your IPs that way.

0 Karma

ololdach
Builder

Hi, as stated above, lookup won't help. You could, however, try this one instead, using a join with inputlookup to get your values:
... deleted Plan A that isn't working in this case, as previously I used tokens instead of query fields... let's move to plan B...

This time it works, I've just tested it wit the following prices.csv:

product_id,effective_start,effective_end,price
foo,1560962373,1570962373,66
foo,1570962373,1590962373,69
bar,1550962373,1580962373,96
bar,1580962373,1590962373,99

And this is the query to solve your question:

|makeresults | eval product_id="foo" | eval time=now() 
| join max=0 product_id [|inputlookup prices.csv]|where time>effective_start AND time<effective_end

Note:
1. The join is still necessary, because you want one event per match, not one event in total with multi-value fields for price and dates that you would get from a lookup
2. As always, the first line is just to recreate some meaningful data for the join. Exchange with your own query to get the product_id
3. Use your own lookup instead of my prices.csv and for being a lazy typist I omitted the _date in the time names

thanchen
Explorer

I have tried this, but with no luck. Seems that inputlookup's where clause can only filter it's own fields, my _time field was from before join.

My current solution is like:

search something | join type=left max=0 product_id [
             | inputlookup http_status | table effective_start_date, effctive_end_date, price ]
             | where (_time>effective_start_date) AND (_time<effective_end_date)
0 Karma

ololdach
Builder

Please take a look at the corrected and tested answer above. My apologies: I didn't test with your data the first time I tried. My bad!

0 Karma

somesoni2
Revered Legend

If you lookup table has IP addresses in CIDR notation, you'd need to setup a Lookup definition with match type as CIDR before you could use lookup command. See below post for the same.

https://answers.splunk.com/answers/305211/how-to-match-an-ip-address-from-a-lookup-table-of.html

This post also has query that you can use to match your search data with lookup and add location field of matching value.

0 Karma

thanchen
Explorer

My situation is a little different, not IP range but time range for price。I‘m looking for something like this:

 ... | lookup price (  _time>effective_start_date AND  _time<effctive_end_date) outputnew price AS history_price

Unfortunately, this doesn't match lookup syntax.

0 Karma
Career Survey
First 500 qualified respondents will receive a $20 gift card! Tell us about your professional Splunk journey.

Can’t make it to .conf25? Join us online!

Get Updates on the Splunk Community!

Can’t Make It to Boston? Stream .conf25 and Learn with Haya Husain

Boston may be buzzing this September with Splunk University and .conf25, but you don’t have to pack a bag to ...

Splunk Lantern’s Guide to The Most Popular .conf25 Sessions

Splunk Lantern is a Splunk customer success center that provides advice from Splunk experts on valuable data ...

Unlock What’s Next: The Splunk Cloud Platform at .conf25

In just a few days, Boston will be buzzing as the Splunk team and thousands of community members come together ...