Bash 스크립트의 awk printf가 유효하지 않습니다.

Bash 스크립트의 awk printf가 유효하지 않습니다.

빌드가 작동하지 않는 이유는 무엇입니까 printf?

awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl"  \
  '{ hit = match($0, /prl/)
     if (hit) {
       fm="%s%s%s\n" ; printf fm frg $0 rst }
     else {
       fm="%s\n" ; printf fm $0 }
   }' <<< "$@"

답변1

awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl" '
{ hit = match($0, prl)
  if (hit) {
    fm="%s%s%s\n" ; printf fm, frg, $0, rst }
  else {
    fm="%s\n" ; printf fm, $0 
  }
}' <<< "$@"

옳은:

  • match($0, /prl/)~이 되다match($0, prl)
  • printf매개변수는 쉼표로 구분해야 합니다.

참고: match() 함수의 두 번째 개선 사항은 정규식입니다.index(in, find)리터럴 매칭을 대체하는 함수프롤.

match() 등 대신 일반 awk 정규식 일치를 사용할 수도 있습니다 $0 ~ prl(다시, 정규식 일치를 원하고 패턴에 정규식 문자가 없다고 가정하는 경우 /).

awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl" '
{ 
  if ($0 ~ prl) {
    fm="%s%s%s\n" ; printf fm, frg, $0, rst }
  else {
    fm="%s\n" ; printf fm, $0
  }
}' <<< "$@"

마찬가지로 최종적으로 코드를 단순화하면 다음과 같이 작성할 수 있습니다.

awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl" '
  { print ($0 ~ prl ? frg $0 rst: $0 }
' <<< "$@"

관련 정보