줄의 하위 문자열

줄의 하위 문자열

로그 파일이 많이 있습니다.

workstation_2020_10_30-230600.log
workstation_2020_11_01-143352.log
workstation_2020_11_02-123203.log
workstation_2020_11_02-181803.log
workstation_2020_11_02-194433.log
workstation_2020_11_02-203701.log

이런 라인

I 06Nov20 13:48:11.838: PrintConsole    PrintConsole(1) unknown 0   2386    ExposureStatusChanged: ExposureId=2386,ExposureName=foobar.tif,ExposureStatus=Successful,PercentComplete=100,GroupingCount=30,OrderingTimeout=0,IsComplete=True

IsComplete=True타임스탬프와 노출 파일 이름을 추출하기 위해 하위 문자열이 발견된 모든 줄을 확인하고 싶습니다 (나중에 설명 ExposureName=).

위 예의 경우 출력은 다음과 같아야 합니다.

06Nov20 13:48:11 foobar.tif

내 최고의 결과는

cat workstation/* | grep tif.*IsComplete=True | cut -d '=' -f 3 | cut -d ',' -f 1 | sort


foobar.tif
foobar2.tif
foobar3.tif
...

이것은 나에게 타임 스탬프를 제공하지 않습니다. 루프나 함수를 작성하지 않고 쉽게 할 수 있는 방법을 모르겠네요...

답변1

awkGNU를 세 번째 인수로 사용한다고 가정하면 match()다음 프로그램이 떠오릅니다.

awk '/IsComplete=True/{match($0,"ExposureName=([^,]+)",a); print $2,$3,a[1]}' *.log

이는 문자열을 포함하는 모든 행과 일치 IsComplete=True하고 " 패턴을 추출한 ExposureName=다음 " 가 ,아닌 문자를 추출하고 후자 부분(예: 파일 이름)을 배열 변수에 저장될 캡처 그룹에 넣습니다 a.

그런 다음 날짜와 시간을 포함하는 두 번째 및 세 번째 "단어"(공백으로 구분된 필드)를 인쇄한 다음 호출에서 캡처 그룹의 내용을 인쇄합니다 match().

귀하의 예를 들어 나는

06Nov20 13:48:11.838: foobar.tif

타임스탬프의 ms 부분을 제거하려면 다음을 gensub()사용하여 이 필드를 수정할 수 있습니다.

awk '/IsComplete=True/{match($0,"ExposureName=([^,]+)",a); print $2,gensub(/\..*$/,"","1",$3),a[1]}' *.log

$2필드( , ) 의 번호 지정은 $3공백의 유무에 따라 크게 달라집니다. 이는 awk기본적으로 행이 필드로 분할되는 방식이므로 타임스탬프 형식이 변경되면(예: 로 ) 구문을 06 Nov 20조정해야 합니다. print성명.

답변2

사용 sed:

sed -E '/IsComplete=True/{
     s/^[^ ]* ([^.]*)\..*ExposureName=([^,]*),.*/\1 \2/;
}' *.log

관련 정보