텍스트 블록의 필드를 읽는 방법은 무엇입니까?

텍스트 블록의 필드를 읽는 방법은 무엇입니까?

Radius 로그 필드를 기반으로 SQL 삽입을 만들고 싶습니다. 예를 들어, 두 가지 유형의 회계 로그가 있고 각 텍스트 블록을 다음과 같은 삽입으로 변환하려고 합니다.

INSERT INTO accouting (date, User-Name, NAS-IP-Address,...)
VALUES ('Thu, 04 Feb 2016 00:21:55.600', [email protected], 200.200.200.200,...)

스크립트는 청크 단위로 읽고, 해당 필드를 식별하고, 이를 기반으로 삽입을 생성해야 합니다.

가능하다면 쉘 스크립트.

감사합니다!

Thu, 04 Feb 2016 00:21:55.600
        User-Name = [email protected]
        NAS-IP-Address = 200.200.200.200
        NAS-Port = 552296838
        Service-Type = Framed
        Framed-Protocol = PPP
        Framed-IP-Address = 14.14.14.14
        Framed-IP-Netmask = 255.255.248.0
        Vendor-Specific = 00:00:13:0a:38:10:66:63:37:35:2e:31:36:34:63:2e:33:36:34:65
        NAS-Identifier = c-bl-rt-router
        Acct-Status-Type = Start
        Acct-Delay-Time = 0
        Acct-Session-Id = 97022017
        Acct-Authentic = RADIUS
        Event-Timestamp = 1454552515
        NAS-Port-Type = Ethernet
        Unisphere-Egress-Policy-Name = block-out
        NAS-Port-ID = 1073994681.17180390:
        Unisphere-Ingress-Policy-Name = block-in

Thu, 04 Feb 2016 00:21:30.455
        User-Name = telco
        NAS-IP-Address = 172.23.10.11
        Service-Type = Framed
        Framed-Protocol = GPRS PDP Context
        Framed-IP-Address = 10.2.3.1
        3GPP-Charging-Id = 1239512257
        Called-Station-Id = telco.net
        Calling-Station-Id = 132333355555
        NAS-Identifier = 10.1.4.67
        Acct-Status-Type = Stop
        Acct-Input-Octets = 0
        Acct-Output-Octets = 0
        Acct-Session-Id = BB481C4649e174c1
        Acct-Session-Time = 0
        Acct-Input-Packets = 0
        Acct-Output-Packets = 0
        Acct-Terminate-Cause = User Request
        Acct-Input-Gigawords = 0
        Acct-Output-Gigawords = 0
        Event-Timestamp = 1454552490
        3GPP-CG-Address = 0.0.0.0
        NAS-Port-Type = Virtual
        3GPP-PDPType = IPv4
        3GPP-GGSN-MCC-MNC = 1414
        3GPP-Negotiated-DSCP = 14
        3GPP-SGSN-MCC-MNC = 1414
        3GPP-IMSI = 724340302052610
        3GPP-Selection-Mode = 0
        3GPP-NSAPI = 8
        3GPP-SGSN-Address = 45.32.55.24
        3GPP-User-Location-Info = 00:27:f4:43:75:52:57:83
        3GPP-Session-Stop-Indicator = ff
        3GPP-IMSI-MCC-MNC = 1414
        3GPP-Charging-Characteristics = 0800
        3GPP-MS-Timezone = 88:01
        3GPP-RAT-Type = 01
        3GPP-IMEISV = 90849320842309834
        3GPP-GGSN-Address = 45.32.55.24
        3GPP-GPRS-QoS-Profile = 08-02070000080000005208

답변1

해결책은 다음과 같습니다.TxR:

@(repeat)
@date
@  (collect)
 @key = @value
@  (last)

@  (end)
@  (output)
INSERT INTO accouting (date, @{key ", "})
VALUES ('@date', @{value ", "})
@  (end)
@(end)

달리기:

$ txr .txr 데이터 삽입
INSERT INTO ACCOUNTING(날짜, 사용자 이름, NAS-IP-주소, NAS-포트, 서비스 유형, 프레임-프로토콜, 프레임-IP-주소, 프레임-IP-넷마스크, 공급업체별, NAS-식별자, 계정-상태- 유형, 청구 지연 시간, 계정 세션 ID, 계정 확인, 이벤트 타임스탬프, NAS 포트 유형, Unisphere 송신 정책 이름, NAS 포트 ID, Unisphere 수신 정책 - 이름)
Value('2016년 2월 4일 목요일 00:21:55.600',[이메일 보호됨], 200.200.200.200, 552296838, 프레임워크, PPP, 14.14.14.14, 255.255.248.0, 00:00:13:0a:38:10:66:63:37:35:2e:31:36:34:63:2e :33:36:34:65,c-bl-rt-router,start,0,97022017,RADIUS,1454552515,ethernet,blocked,1073994681.17180390:,blocked)
INSERT INTO 계정(날짜, 사용자 이름, NAS-IP-주소, 서비스 유형, 프레임 프로토콜, 프레임 IP 주소, 3GPP-계정 ID, 호출 스테이션 ID, 호출 스테이션 ID, NAS-식별자, 계정 상태 유형, 계정 입력 옥텟, 회계 출력 옥텟, 회계 세션 ID, 회계 세션 시간, 회계 입력 패킷, 회계 출력 패킷, 회계 종료 사유, 계정 입력 - 수천 메가워드, 계정 아웃-기가워드, 이벤트 타임스탬프, 3GPP-CG-주소, NAS 포트 유형 , 3GPP-PDP 유형, 3GPP-GGSN-MCC-MNC, 3GPP-협상-DSCP, 3GPP-SGSN-MCC-MNC, 3GPP-IMSI, 3GPP-선택 모드, 3GPP-NSAPI, 3GPP-SGSN-주소, 3GPP- 사용자 위치 정보, 3GPP-세션 중지 표시기, 3GPP-IMSI-MCC-MNC, 3GPP-충전 기능, 3GPP-MS - 시간대, 3GPP-RAT-유형, 3GPP-IMEISV, 3GPP-GGSN-주소, 3GPP-GPRS- QoS 프로필)
Value("2016년 2월 4일 목요일 00:21:30.455",telco,172.23.10.11,framed,GPRS PDP context,10.2.3.1,1239512257,telco.net,132333355555,10.1.4.67,stop,0 0 :27 :f4: 43:75: 52:57:83,ff,1414,0800,88:01,01,90849320842309834,45.32.55.24,08-02070000080000005208)

관련 정보