请教文本解析问题,sscanf相关
数据源是一段审计日志,格式如下:
type=SYSCALL msg=audit(07/13/2012 02:24:06.652:12319924) : arch=x86_64 syscall=write success=yes exit=35 a0=2 a1=7fff8df61060 a2=23 a3=7272652073656c75 items=0 ppid=4405 pid=4415 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts14 ses=83 comm=auditctl exe=/sbin/auditctl subj=unconfined_u:system_r:auditctl_t:s0 key=(null)
sscanf可否实现将部分数据取出的功能,例如仅取出type,arch,uid,key这四项的内容。
似乎需要正则表达式,初次使用,先感谢各位的指点。
[解决办法]
#include <stdio.h>#include <string.h>char s[] ="type=SYSCALL msg=audit(07/13/2012 02:24:06.652:12319924) : arch=x86_64 syscall=write success=yes exit=35 a0=2 a1=7fff8df61060 a2=23 a3=7272652073656c75 items=0 ppid=4405 pid=4415 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts14 ses=83 comm=auditctl exe=/sbin/auditctl subj=unconfined_u:system_r:auditctl_t:s0 key=(null)";char *p,*q;char k[100],v[100];int n,i,j;int main() { p=s; while (1) { if (2==sscanf(p,"%99[^=]=%99[^=]%n",k,v,&n)) { i=strlen(v)-1; j=0; while (1) { if (i<0) break; if (' '==v[i]) { v[i]=0; break; } i--; j++; } printf("%s=\"%s\"\n",k,v); if (0==strcmp("type",k)) printf("---->FOUND: %s=\"%s\"\n",k,v); if (0==strcmp("arch",k)) printf("---->FOUND: %s=\"%s\"\n",k,v); if (0==strcmp("uid" ,k)) printf("---->FOUND: %s=\"%s\"\n",k,v); if (0==strcmp("key" ,k)) printf("---->FOUND: %s=\"%s\"\n",k,v); p+=n-j; } else break; } return 0;}//type="SYSCALL"//---->FOUND: type="SYSCALL"//msg="audit(07/13/2012 02:24:06.652:12319924) :"//arch="x86_64"//---->FOUND: arch="x86_64"//syscall="write"//success="yes"//exit="35"//a0="2"//a1="7fff8df61060"//a2="23"//a3="7272652073656c75"//items="0"//ppid="4405"//pid="4415"//auid="root"//uid="root"//---->FOUND: uid="root"//gid="root"//euid="root"//suid="root"//fsuid="root"//egid="root"//sgid="root"//fsgid="root"//tty="pts14"//ses="83"//comm="auditctl"//exe="/sbin/auditctl"//subj="unconfined_u:system_r:auditctl_t:s0"//key="(null)"//---->FOUND: key="(null)"