![awk 명령을 사용하여 이 두 출력을 어떻게 분리할 수 있습니까?](https://rvso.com/image/31645/awk%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%9D%B4%20%EB%91%90%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EB%B6%84%EB%A6%AC%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
내 결과는 다음과 같습니다.
MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099
나는 시간만을 원한다.
어떻게 분리할 수 있나요?
답변1
입력 구조를 분석합니다.
key1=value1;key2=value2
이는 로 구분된 필드이며 , 필드 구분자를 ;
만들어 구문 분석할 수 있습니다 . ;
그런 다음 필드의 값을 추출하려면 함수를 사용하여 부분 sub
을 제거합니다 key=
(또는 split
on에서 두 번째 부분을 가져오거나 of /=/
뒤에 있는 하위 문자열을 가져옵니다 ). 시간이 항상 두 번째 필드에 있는 경우 다음은 간단한 접근 방식입니다.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