awk cmd에서 var를 사용하는 bash가 작동하지 않습니다.

awk cmd에서 var를 사용하는 bash가 작동하지 않습니다.

필드 중 하나가 사용자 입력과 같은 경우 ASCII 테이블을 필터링하는 다음 스크립트가 있습니다.

ascii () {
        arg1=$1
        cmd=$(man ascii | awk '/000/,/077/ {print}' | sed '/^$/d')
        if [ #$ -eq 0 ]
                then
                        echo "${cmd}"
                else
                        newcmd=$(echo "${cmd}" | awk '{for(i=1;i<NF;i++) if ($i=="${arg1}") {print $0}}')
                        echo "${newcmd}"
        fi
}

말할 필요도 없이 작동하지 않지만 다음과 같은 오류가 발생합니다.

bash: [: missing `]'

그리고 awk 문자열 내에 표시된 색상은 내 쉘 인스턴스에서 모두 보라색이므로 "${arg1}"이 올바르게 해석되지 않은 것으로 가정합니다.

(awk도 달러 기호 구문을 사용하고 함수 인수와 awk 필드를 구별하는 방법을 모르기 때문에 사용자 입력의 첫 번째 인수로 var를 사용하고 있습니다.)

답변1

나는 이것이 당신이 원하는 것일 것이라고 생각하지만 예제 입력이나 예상 출력이 없고 어떤 값이 함수에 인수로 전달될 수 있는지에 대한 아이디어가 없으면 이것은 테스트되지 않은 추측입니다.

ascii() {
    man ascii |
    awk -v tgt="$1" '
        /000/ { f=1 }
        f && NF && ((tgt == "") || index(" "$0" "," "tgt" "))
        /077/ { f=0 }
    '
}

바라보다awk 스크립트에서 쉘 변수를 사용하는 방법awk 스크립트에서 쉘 변수 값을 사용하는 방법에 대한 추가 정보.

man ascii내 시스템에서는 "ascii 없이 수동 입력"이 출력되므로 이 명령이 시스템에서 어떤 형식으로 출력되는지는 알 수 없지만 awk 스크립트에 대한 입력에서 관심 있는 부분(예: 도표 문자)에 공백이 아닌 공백이 포함되어 있는 경우 그런 다음 대상 문자열과 비교하기 위해 모든 공백을 공백으로 변환하는 것과 유사한 작업을 수행합니다.

ascii() {
    man ascii |
    awk -v tgt="$1" '
        /000/ { f=1 }
        { rec=$0; gsub(/[[:space:]]+/," ",rec) }
        f && NF && ((tgt == "") || index(" "rec" "," "tgt" "))
        /077/ { f=0 }
    '
}

및 설정 시 관련 작업만 수행하면 tgt보다 효율적으로 작성할 수 있습니다 . 예를 들면 다음과 같습니다.fNF

ascii() {
    man ascii |
    awk -v tgt="$1" '
        !NF { next }
        /000/ { f=1 }
        f {
            if ( tgt == "" ) {
                print
            }
            else {
                rec = $0
                gsub(/[[:space:]]+/," ",rec)
                if ( index(" "rec" "," "tgt" " ) {
                    print
                }
            }
            if ( /077/ ) {
                f=0
            }
        }
    '
}

그러나 입력 매뉴얼 페이지의 크기를 고려하면 간결함보다는 효율성을 걱정할 가치가 없습니다.

관련 정보