awk 명령을 사용하여 이 두 출력을 분리하는 방법

awk 명령을 사용하여 이 두 출력을 분리하는 방법

이것은 내 결과입니다.

MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099

내가 원하는 것은 시간뿐이다.

어떻게 분리할 수 있나요?

답변1

입력 구조를 분석합니다.

key1=value1;key2=value2

이는 으로 구분된 필드이며 ;, ;필드 구분자를 설정하여 구문 분석할 수 있습니다. 그런 다음 필드의 값을 추출하려면 함수를 사용하여 sub해당 부분을 제거합니다 key=(또는 split계속해서 /=/두 번째 부분을 가져오거나 index다음의 하위 문자열을 가져옵니다 =). 시간이 항상 두 번째 필드에 있는 경우 간단한 접근 방식은 다음과 같습니다.

awk -F ';' '{sub(/^[^=]*=/, $2); print $2}'

이름으로 필드에 액세스하려면(더 안정적일 수 있음) 필드를 반복할 수 있습니다.

awk -F ';' '{i=1; while (i <= NF) {if ($i ~ /^EsbTiming=/) {sub(/^[^=]*=/, $i); print $i}}}'

;구문 분석할 행이 하나만 있는 경우 레코드 구분 기호와 필드 구분 기호를 만드는 것이 더 간단합니다 =.

awk -F '=' -v RS=';' '$1 == "EsbTiming" {print $2}'

이는 추가 개행 문자를 인쇄합니다. 쉘 스크립트에서 명령 대체에 이 명령을 사용하는 경우에는 걱정할 필요가 없습니다 (… | awk …). 이 추가 줄 바꿈이 필요하지 않으면 ORS(출력 레코드 구분 기호)를 빈 문자열로 설정하세요.

awk -F '=' -v RS=';' -v ORS= '$1 == "EsbTiming" {print $2}'

여기서는 좋은 결과를 제공하는 직접 정규식 접근 방식도 있습니다.

awk 'match($0, /(^|;)EsbTiming=/) {s = substr($0, RSTART+RLENGTH); sub(/;.*/, "", s); print s}'

답변2

몇 가지 awk 답변이 있습니다. 여기에 bash를 사용하여 수행할 수 있는 한 가지 방법이 있습니다. 먼저 변수 설정을 평가합니다.

source <(echo "MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099")

이제 EsbTiming다음과 같이 직접 액세스할 수 있습니다.

printf "Date: %s\nTime: %s\n" ${EsbTiming%T*} ${EsbTiming#*T}

산출:

Date: 2013-04-12
Time: 01:07:46.099

답변3

awk 'BEGIN{ FS=":" } /Timing/ {print $2":"$3 }' Input_file

또는

awk  '/Timing/{split($0,arr,":") } {print arr[2]":"arr[3]}'  input_file

또는

awk -F: '/Timing/{$1=""; print}'  input_file

포도 용액

grep -oP '(?<=EsbTiming=.{14}).*' Input_file

답변4

다음을 사용하는 것이 마음에 들지 않으면 매우 간단한 방법이 있습니다 awk.sed

sed 's/.*Timing=//' file.txt |awk -FT '{print $2}'

sed문자열 "Timing="을 포함하여 모든 것을 부분적으로 축소하고 다음을 남깁니다.

2013-04-12T01:07:46.099

awk문자 "T"를 분할하여 시간을 나타내는 두 번째 필드를 인쇄합니다.

01:07:46.099

관련 정보