다음 awk 코드 섹션에는 파일 이름과 전체 Linux 경로가 포함되어 있으며, 여기에는 날짜 file
유형 디렉터리로 YYMMDD가 포함될 수 있습니다.backup-YYMMDD
isDate[file]
즉, YYMMDD를 할당하고 싶습니다 isDate[file]=YYMMDD
.
어떻게 해야 하나요?
for (file in files) {
if ( file ~ /(^|\/)(library|labs data|current)(\/|$)/ ) {
isKeep[file]
}
else if ( file ~ /(^|\/)(backup-[0-2][0-9][0-1][0-9][0-3][0-9])(\/|$)/ ) {
isDate[file]
}
else {
isDelete[file]
}
}
답변1
GNU에는 패턴으로 특징지어지는 문자열 구성 요소의 실제 값을 추출할 수 있는 명령이 awk
있습니다 . match
그래서 당신은 사용할 수 있습니다
match(file,"^[[:print:]]*(backup-[0-2][0-9][0-1][0-9][0-3][0-9])[[:print:]]*$",pats);
isDate[file]=pats[1]
else if ....
프로그램 의 일부입니다. (배열) 변수는 다음부터 시작하여 pats
모든 RegExp (...)
의 문자열에 포함된 모든 하위 표현식 으로 채워집니다.색인 1( pats[0]
실제 값이 됩니다.모두표현하다). 그룹화된( backup-YYMMDD
부분적으로) 하나의 하위 표현식만 있으므로 pats[1]
찾고 있는 내용이 포함됩니다.
아니면 그냥 시도해 볼 수도 있습니다
...
else if (match(file,"^[[:print:]]*(backup-[0-2][0-9][0-1][0-9][0-3][0-9])[[:print:]]*$",pats)==1) {
isDate[file]=pats[1]
}
...
물론 이 접근 방식은 다음 사항에 의존합니다.단 하나패턴의 경로 구성요소를 포함합니다 backup-YYMMDD
.
편집하다(OP의 코멘트, @macxpat)
"^[[:print:]] ... $"
이 답변에서는 정규식을 지정하기 위해 문자열 상수( )를 사용했습니다 . 그러나 다음과 같이GNU Awk 사용자 가이드,정규식 상수로 지정하는 것이 더 깔끔하고 효율적입니다.. 그러므로 활용하는 것이 더 좋습니다.
match(file,/^[[:print:]]*(backup-[0-2][0-9][0-1][0-9][0-3][0-9])[[:print:]]*$/,pats)
위의 예에서!