아래와 같이 수백 개의 행이 있습니다 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
행을 쉘 할당문으로 변환합니다 .
줄의 시작 부분( ) 에서만 대시와 숫자( ) 다음에 하나 이상의 공백( ) 이 오는
^
순서를 다음으로 바꾸세요 .[-0-9]*
*
date=
s/^[-0-9]* */date=/
쉼표
.*
뒤에 임의의 문자( )와 공백이 뒤따르면 교체합니다 .thisOne=
s/,.*thisOne={/ /
닫는 중괄호( )를 제거 하고 줄의 (묵시적인) 끝에
}
다른 문자( )를 제거합니다..*
s/}.*//
모든 쉼표(
,
)를 공백으로 바꿉니다.s/,/ /g
|
예제 스크립트에서는 파일 끝에 있는 파이프를 일시적으로 제거하고 sed
스크립트의 명령 부분만 실행하여 어떻게 작동하는지 실험해 볼 수 있도록 권장합니다.