Yes, splunk will replace the unprintable character with their C-style hex notation before indexing. That can be quite annoying, but then again, so is trying to search for unprintable characters. If your curious, you can see a table of these conversions on the Wikipedia ASCII page, search down the page for the "Start of Header" character.
It seems like you have a fields inside of a field thing going on here, right?
You have fields delimited by a pipe ( | ), and then the 8th field (at least in your given example) has and additional delimited field. I'm not sure how splunk handles that exactly. If you simply setup your delimiter as the ^A (or \x1 ) then your first field would contain:
M|219620|0|i|I|20100506-16:15:53.443|463|8=FIX.4.4 , when you probably only want it to contain 8=FIX.4.4 . So simply getting your delimiter set properly isn't going to fully work.
I'm guessing it would make the most sense to first extract the outer set of fields first using DELIMS="|" and then, setup a secondary field extract to pull out your embedded fields.
So, perhaps you would end up with something like this:
props.conf :
[FIX]
SHOULD_LINEMERGE = false
KV_MODE = none
REPORT-outer_fields = get_outer_fields, get_inner_fields
transforms.conf :
[get_outer_fields]
DELIMS="|"
FIELDS = "f1", "f2", "f3", "f4", "f5", "_f6", "f7", "inner_fields"
[get_inner_fields]
REGEX = (?:^|\\x1) (?<a>.+)\\x1(?<b>.+)\\x1(?<c>.+)\\x1(?<d>.+)$
SOURCE_KEY = inner_fields
I think this should work. This does seem like a complicated scenario.
If the number of subfields is not constant (4), then you could use a multi-value field extraction like this: (That regex should work, it took me a few tries, but it seems to be best solution I could come up with)
[get_inner_fields]
REGEX= (?=^|\\x1)(?:\\x1)?(?<my_fields>.+?)(?:\\x1)?(?=$|\\x1)
SOURCE_KEY = inner_fields
MV_ADD = True
Another possible option (and I don't know the FIX format at all, so this may not work). If the 8 in 8=FIX.4.4 means something like 'fix_version_number', you could just write a bunch of extracts that use the leading number of map to different field names. So for example of "8", you could add something like this to your props file:
EXTRACT-fix_field_8 = (?:\||\\x1|^)8=(?<fix_version_number>.*?)(?:\||\\x1|$)
Another thought (which may make all of the above options simpler) would be to add a SEDCMD to your soucetype to change all of the ^A characters into something more useful at index time. Maybe something like a comma? (You would probably want to find a character or sequence of characters not already being used in your events)
Also, using a punctuation character like a comma also has the advantage of improving the way terms are segmented in your index which will let your search on more of these embedded fields more efficiently. For example, in your example event, you can search for "8=FIX.4.4" , but you can't search for "50=FXSpot" because it's would be stored in the index as "150=FXSpot" , you would have to search with "*50=FXSpot" instead. Using a better punctuation character works around this problem.
One more option. Email Glenn and take a look at a custom search command he is using to handle FIX log processing. See his post here:
Has anyone got a method for decoding FIX financial format logs?
... View more