라인의 필드를 쉘 변수로 추출

라인의 필드를 쉘 변수로 추출

아래와 같이 수백 개의 행이 있습니다 connRefused.log.

        2015-12-12 00:12:10,227 ERROR [Testing-KeepAlive-01] c.v.v.v.Connection [Connection.java : 001] failed to bind to {name=TestGW,direction=BOTH_WAY,username=espada,password=whatever,binds=1,keepAliveInterval=60000,params={Payload=0, useEXP=1},thisOne={id=1001,name=TestGw,ip=192.168.0.1,port=88}}: Connection refused

connRefused.log다음은 배열을 읽기 위한 내 스크립트(간체)의 일부입니다.

IFS=$'\n' read -d '' -r -a lines < /path/log/connRefused.log
for xx in "${lines[@]}"
  do
    ??? # what to do here?
    echo $Date
    echo $ID
    echo $Name
    echo $IP
    echo $Port
  done

위 행에서 필요한 데이터를 가져와 날짜, ID, 이름, IP, 포트 변수에 저장하려면 어떻게 해야 합니까?

thisOne={id=1001,name=TestGw,ip=192.168.0.1,port=88}.

$Date의 경우 시간 부분만 필요합니다.

답변1

배열을 사용할 필요는 없습니다. 입력 데이터가 매우 규칙적으로 보이기 때문에 입력 데이터를 쉘 할당문으로 변환한 다음 이를 쉘로 읽어 들여 계산하겠습니다. 이와 같이:

#!/bin/sh

sed '
    s/^[-0-9]*  */date=/
    s/,.*thisOne={/ /
    s/}.*//
    s/,/ /g
' "$@" |
while read line
do
    eval $line
    echo date=$date
    echo id=$id
    echo name=$name
    echo ip=$ip
    echo port=$port
done

sed명령은 입력 라인을 다음으로 변환합니다.

date=00:12:10 id=1001 name=TestGw ip=192.168.0.1 port=88

루프 while는 한 번에 한 줄을 읽고 eval $line해당 줄이 셸에서 실행되도록 하며 변수를 주어진 값으로 설정합니다.

스크립트는 명령줄이나 표준 입력에서 파일 이름을 처리합니다( 명령 "$@"끝에 .가 있음에 유의 sed).

이 명령은 sed일련의 (대체) 명령을 통해 s행을 쉘 할당문으로 변환합니다 .

  1. 줄의 시작 부분( ) 에서만 대시와 숫자( ) 다음에 하나 이상의 공백( ) 이 오는 ^순서를 다음으로 바꾸세요 .[-0-9]**date=

    s/^[-0-9]*  */date=/
    
  2. 쉼표 .*뒤에 임의의 문자( )와 공백이 뒤따르면 교체합니다 .thisOne=

    s/,.*thisOne={/ /
    
  3. 닫는 중괄호( )를 제거 하고 줄의 (묵시적인) 끝에 }다른 문자( )를 제거합니다..*

    s/}.*//
    
  4. 모든 쉼표( ,)를 공백으로 바꿉니다.

    s/,/ /g
    

|예제 스크립트에서는 파일 끝에 있는 파이프를 일시적으로 제거하고 sed스크립트의 명령 부분만 실행하여 어떻게 작동하는지 실험해 볼 수 있도록 권장합니다.

관련 정보