awk를 사용하여 여러 문자열을 기반으로 파일 경로 필터링

awk를 사용하여 여러 문자열을 기반으로 파일 경로 필터링

awk를 사용하여 스크립트의 파일 경로를 필터링하여 정규식의 모든 항목을 무시하려고 합니다.

FILTERED_FILE=$(echo $File |  awk -F / "{(for(i=NF; i>=0; i--) {if $(i!~^(NewConfig|Old|old|backup|Backup|Servers)$ print $i}}") ;

기본적으로 필드별로 반복하고 이러한 키워드가 포함되지 않은 파일 경로의 첫 번째 필드를 추출하려고 합니다. 예를 들어 파일 경로가 다음과 같은 경우:

/etc/Backup/Servers/blah/Old

$FILTERED_FILE변수가 되기를 원합니다 blah.

이것정밀한이 줄은 다른 스크립트에서 예상대로 작동하지만 이제 awk 변수($i)는 여전히 비어 있습니다. 저는 awk의 초보자이므로 분명히 뭔가를 놓치고 있습니다. 어디를 봐야 할지 제안해 주시면 감사하겠습니다. 나는 이 줄이 스크립트의 다른 줄에 의존하지 않는다고 생각하지만(다시 말하지만 이것은 내가 적용한 이전 스크립트에서 작동했습니다) 필요한 경우 더 업로드하겠습니다. 나도 awk에 전념하지 않습니다. 더 나은 도구(grep, sed 등)를 생각할 수 있다면 그것도 좋을 것입니다.

감사합니다!

답변1

코드 뿐만 아니라 쉘 awk에도 몇 가지 문제가 있다고 생각합니다.

먼저, awk에서와 같이 항상 코드를 작은따옴표로 묶으십시오 awk '<commands>'. 그렇지 않으면 이상한 효과가 발생할 수 있습니다.껍데기$<...>진술을 설명하십시오 .

둘째, 여러 위치에서 구문이 잘못된 것 같습니다.

  • 당신이 찾고 있다고 말했어요첫 번째필드가 일치하지 않지만 찾고 있는 것 같습니다.마지막하나? 그러나 코드가 인쇄됩니다.모두첫 번째 일치 항목을 찾은 후 루프에서 벗어나지 않으므로 일치하지 않는 다른 필드에도 마찬가지입니다.
  • RegExp 비교는 다음과 같습니다.
    if ($i !~ /^( .... )$/) { ... }
    
  • if예제 코드에서 문의 닫는 괄호가 누락되었습니다.

셋째, 쉘 스크립트에서 명령을 큰따옴표로 바꿔야 합니다.

수정된 awk코드는 다음과 같습니다.

awk -F '/' '{for (i=NF; i>0; i--) {if ($i !~ /^(NewConfig|[Oo]ld|[Bb]ackup|Servers)$/) {print $i; exit}}}'

스크립트에서 호출하려면 다음을 사용하세요.

Filtered_File="$( echo "$File" | awk -F '/' ' .... ')"

구조로 인해 이 마지막 부분은 실제로 스크립트 내부에서만 작동합니다 !~. 명령줄에서 완료되면 bash적어도 명령 대체를 위한 하위 쉘을 시작하기 전에 명령 기록 확장이 시도되며 이로 인해 오류 메시지가 표시됩니다.

관련 정보