수학적 계산을 위해 awk에 문자열을 어떻게 입력합니까?

수학적 계산을 위해 awk에 문자열을 어떻게 입력합니까?
#!/bin/sh --

expression_to_evaluate='12 + 3'

printf '%s\n' "Arithemtic Expansion: $(( $expression_to_evaluate ))"

printf '%s' 'bc: '
printf '%s\n' "$expression_to_evaluate" | bc

printf '%s' 'awk: '
awk -v expression_to_evaluate="$expression_to_evaluate" -- 'BEGIN{printf "%d\n", expression_to_evaluate}'

산출:

Arithemtic Expansion: 15
bc: 15
awk: 12

awk15 대신 12를 반환합니다. 수학 계산을 수행하기 위해 문자열을 어떻게 입력합니까 awk?

답변1

expression_to_evaluate이것이 작동하는 동안 원본을 제어하지 않는 한 보안 위험이 있으므로 수행하지 않는 것이 좋습니다 .

$ expression_to_evaluate='12 + 3'
$ awk "BEGIN{printf \"%d\n\", $expression_to_evaluate}"
15

답변2

awk문자열로 제공되는 일반 산술 표현식을 평가할 수 있는 방법은 없습니다. bc반면에 쉘과 마찬가지로 표현식을 받아들이고 평가합니다.

문자열을 수학 표현식으로 평가하려면 awk표현식을 다음과 같이 삽입해야 합니다.암호프로그램 에 추가 awk하거나(잠재적으로 코드 삽입 취약점 생성) 평가하려는 표현 유형에 대한 자체 파서를 작성하십시오(이것은 일반적인 컴퓨터 과학 과제입니다).

의 값이 정수로 변환되면 문자열의 공백 문자까지 변환될 수 있으므로 코드 12에서 이를 얻을 수 있습니다 . 이는 문자열을 정수로 변환할 때 C 라이브러리 함수가 작동하는 방식이며 아마도 뒤에서 사용되는 것 같습니다.awkexpression_to_evaluatestrtol()awk

답변3

편집하다

나는 이 함수를 오래 전에 작성하여 자동으로 awk로 가져왔다는 사실을 잊어버렸습니다.

eval 함수의 코드는 다음과 같습니다.

function eval(str,cmd,line,ret) {
    cmd = "gawk \047BEGIN{print " str "; exit}\047"
    if ( (cmd | getline line) > 0 ) {
        ret = line
    }
    close(cmd)
    return ret
}

파일에 넣으면 스크립트 전에 가져올 수 있습니다

awk -i fileWithFunction.awk '{print eval($1)}'

나는 awk를 함수로 가지고 있으므로 자주 사용하는 함수를 가져오는 것에 대해 생각할 필요가 없습니다.

awk () {
    awk -i awk_functions.awk "$@"
}

혼란을 드려 죄송합니다!

원본 게시물

(참고로 이 함수는 파일에서 가져오거나 awk 스크립트에 넣어야 합니다! 위를 참조하세요.) awk 의 함수는 eval()원하는 작업을 수행합니다. 이는 gawk에 따라 다를 수 있지만 사용하지 않는 경우에는 gawk그렇게 해야 합니다. :)

$ expression="1+1"
$ echo | awk -v expression=$expression '{print eval(expression)}'
2

$ expression="2^10"
$ echo | awk -v expression=$expression '{print eval(expression)}'
1024

간단한 awk 프로그램 입력을 생성하여 입력 값을 가져와 처리할 수도 있습니다.

$ awk 'BEGIN{printf "Expression:"}{print eval($0);printf "Expression:"}'
Expression:2^29
536870912
Expression: log(10)/log(30)
0.676992
Expression: I love cake

답변4

echo $expression_to_evaluate | awk -F "+" '{print ($1+$2)}'

관련 정보