The following script will collate the information for you.
code:
BREAK ON CLS
;
; logparse.kix

; Amendment history:
; 11 September 2001 RMH File is now CLOSE() when input exhausted
; 5 September 2001 RMH Initial release. Created with VIM.

; Parse logfiles and convert to CSV format.
; Change the parameters on the lines marked <<CHANGE ME>> to fit your local
; setup.

DIM $TokenName[64]
DIM $TokenValue[64]
$TokenLimit=64

$DEBUG=0 ; <<CHANGE ME>> 1=Debug info on, 0=off
$SourcePattern="d:\kixdev\*.log" ; <<CHANGE ME>> File path/pattern for log source files
$TargetCSVFile="d:\kixdev\output.csv" ; <<CHANGE ME>> Consolidated output file
$MaximumSoftware=0 ; Most number of software packages

$TokenCount=0
$SystemTokens="~"
$Token = "DOMAIN" GOSUB SUBAddToken
$Token = "LOGON_SERVER" GOSUB SUBAddToken
$Token = "WORKSTATION" GOSUB SUBAddToken
$Token = "USERID" GOSUB SUBAddToken
$Token = "FULLNAME" GOSUB SUBAddToken
$Token = "PRIVILIDGE" GOSUB SUBAddToken
$Token = "IPADDRESS" GOSUB SUBAddToken
$Token = "MAC_ADDRESS" GOSUB SUBAddToken
$Token = "LOCATION" GOSUB SUBAddToken
$Token = "OS_VERSION" GOSUB SUBAddToken
$Token = "CPU_SPEED(MHz)" GOSUB SUBAddToken
$Token = "FREE_C:\(Bytes)" GOSUB SUBAddToken
$Token = "KIX_VERSION" GOSUB SUBAddToken
$Token = "KIX_Directory" GOSUB SUBAddToken
$Token = "AMO_INSTALLED" GOSUB SUBAddToken
$Token = "SDO_INSTALLED" GOSUB SUBAddToken
$Token = "LAST_LOGIN" GOSUB SUBAddToken

$=REDIRECTOUTPUT($TargetCSVFile,1)
$Index=1 WHILE $Index <= $TokenCount GOSUB SUBGetValue '"$Token",' $TokenValue[$Index]="" $Index=$Index+1 LOOP
"Software..." ?
$=REDIRECTOUTPUT("")

$SourceFile=DIR($SourcePattern)
WHILE $SourceFile <> "" AND @ERROR = 0
GOSUB SUBProcessFile
$SourceFile=DIR()
LOOP

? "Processing complete. Outputfile is " $TargetCSVFile ?

EXIT

:SUBProcessFile
"Processing input file " $SourceFile ?
$Section=0
IF OPEN(1,$SourceFile,2)
"Error opening " $SourceFile " for reading" ?
"Additional info: " @ERROR @SERROR ?
RETURN
ENDIF
$LineCount=0
$Input=READLINE(1)
WHILE @ERROR=0
$LineCount=$LineCount+1
IF $DEBUG " $LineCount >> " $Input ? ENDIF
gosub SUBParseLine
$Input=READLINE(1)
LOOP
$=CLOSE(1)
$=REDIRECTOUTPUT($TargetCSVFile,0) ? $=REDIRECTOUTPUT("")
RETURN

:SUBParseLine
if $Input = "" RETURN ENDIF
if substr($Input,1,1) = "-" RETURN ENDIF
IF $Input = "System Information"
$Section=1
$SectionName=$Input
" Processing " $SectionName "..." ?
RETURN
ENDIF
IF $Input = "Software Information"
$=REDIRECTOUTPUT($TargetCSVFile,0)
GOSUB SUBPrintSystem
$=REDIRECTOUTPUT("")
$Section=2
$SectionName=$Input
" Processing " $SectionName "..." ?
RETURN
ENDIF
if $Section ELSE
IF $Debug " Discarding unknown Line" ? ENDIF
RETURN
ENDIF
$Routine="SUBSection" + $Section
GOSUB $Routine
RETURN

:SUBSection1
$TokenIN=$Input
GOSUB SUBGetToken $SystemElement=$Token
GOSUB SUBGetIndex
IF $Index ELSE " INVALID TOKEN " GOSUB SUBParseError RETURN ENDIF
GOSUB SUBGetToken
IF $Token <> "=" " INVALID LINE FORMAT " GOSUB SUBParseError RETURN ENDIF
IF $Debug " System element " $SystemElement " has value '" $TokenIn "'" ? ENDIF
$TokenValue[$Index]=$TokenIn
RETURN

:SUBSection2
$TokenIN=$Input
GOSUB SUBGetToken IF $Token <> "Software" " Not a software entry " GOSUB SUBParseError RETURN ENDIF
GOSUB SUBGetToken IF $Token <> "Entry" " Not a software entry " GOSUB SUBParseError RETURN ENDIF
GOSUB SUBGetToken
$SoftwareElement=VAL($TOKEN)
IF $SoftwareElement ELSE " No software entry number " GOSUB SUBParseError RETURN ENDIF
IF $SoftwareElement > $MaximumSoftware $MaximumSoftware=$SoftwareElement ENDIF
IF $Debug " Software element " $SoftwareElement " has value '" $TokenIn "'" ? ENDIF
$=REDIRECTOUTPUT($TargetCSVFile,0)
'"$TokenIn",'
$=REDIRECTOUTPUT("")
RETURN

:SUBGetToken
$Space=INSTR($TokenIN," ")
IF $Space
$Token=substr($TokenIn,1,$Space-1)
$TokenIn=substr($TokenIn,$Space+1,9999)
ELSE
$Token=$TokenIn
ENDIF
RETURN

:SUBParseError
"ERROR parsing line " $LineCount " in section " $SectionName ?
" >> $Input" ?
RETURN

:SUBAddToken
$TokenCount=$TokenCount + 1
$Key=CHR($TokenCount+ASC("A")-1)
IF $TokenCount >= $TokenLimit "TOO MANY TOKENS" EXIT ENDIF
$SystemTokens="$SystemTokens$Key~$Token~"
RETURN

:SUBGetIndex
$Index=INSTR($SystemTokens,"~" + $Token + "~")
if $Index ELSE RETURN ENDIF
$Index=ASC(substr($SystemTokens,$Index-1,1))-ASC("A")+1
RETURN

:SUBGetValue
$Token=""
$Key="~" + CHR($Index+ASC("A")-1) + "~"
$MyIndex=INSTR($SystemTokens,$Key)
if $MyIndex ELSE RETURN ENDIF
$Token=substr($SystemTokens,$MyIndex+3,999)
$Token=substr($Token,1,INSTR($Token,"~")-1)
RETURN

:SUBPrintSystem
$MyIndex=1
WHILE $MyIndex <= $TokenCount
'"' $TokenValue[$MyIndex] '",'
$TokenValue[$MyIndex]=""
$MyIndex=$MyIndex+1
LOOP
RETURN


<EDIT>I haven't put any code in to deal with speech marks in the data - these will fubar the CSV file. If you need this functionality, the easiest thing is to strip speechmarks as eash line if read from the file.</EDIT>

[ 05 September 2001: Message edited by: Richard Howarth ]

<EDIT2>
Added a CLOSE after the input exhausted to allow the file stream to be reopened for the next file - avoids a -3 error (Thanks Chas ;))
<EDIT2>

[ 11 September 2001: Message edited by: Richard Howarth ]