로그 파일이 많이 있습니다.
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
awk
GNU를 세 번째 인수로 사용한다고 가정하면 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