시스템 호출, AWK 및 외부 입력 도입

시스템 호출, AWK 및 외부 입력 도입
awk '{ TEMPVAR="/usr/bin"; printf("%s", system("ls $TEMPVAR")); }' empty

TEMPVAR이 예에서는 호출 에 변수를 도입하려고 합니다 system. 어떻게 해야 합니까?

내 목표는 다음과 같습니다. 파일의 각 줄에서 발생하는 호출을 사용 하려고 합니다 date -d $0 +%s. 그러나 해당 값을 시스템 호출에 system넣는 방법에 어려움을 겪고 있습니다 .$0

답변1

awkENVIRON환경 변수는 특수 배열을 사용하여 액세스할 수 있습니다 . 그러나 배열 요소에 값을 할당할 수는 있지만 awk's system또는 | getline실행된 명령 의 컨텍스트에서는 전달되지 않습니다 print |. 이 배열은 다음 용도로만 ENVIRON사용됩니다.awk얻다전달하는 환경 변수의 값입니다.

을 수행할 수 있지만 system("ls " var)의 (또는 또는 )에 전달된 문자열은 실제로 인수로 전달되므로 쉘 코드로 해석됩니다.awksystem()print || getlinesh -c

예를 들어, awk var변수에 가 포함되어 있으면 호출된 파일을 나열 foo;rm -rf /하라는 지시가 아니라 호출된 파일을 나열한 다음 명령을 실행하라는 지시를 받습니다.ls"foo;rm -rf /"foorm

var따라서 변수의 쉘 특정 문자를 이스케이프해야 할 수도 있습니다.

예를 들어 다음과 같이 할 수 있습니다.

awk '
  function escape(s) {
    gsub(/'\''/, "&\\\\&&", s)
    return "'\''" s "'\''"
  }
  {
    cmd = "date -d " escape($0) " +%s"
    cmd | getline seconds
    close(cmd)
    print seconds
  }'

이는 한 줄에 하나의 셸과 하나의 명령을 실행하는 것을 의미하지만 date, 셸 자체를 사용하여 파일을 읽을 수도 있습니다.

while IFS= read <&3 -r line; do
  date -d "$line" +%s
done 3< the-file

답변2

Awk 변수를 전달하면체계, 인용하려면 쉘이 필요합니다.

function quote(str,   d, m, x, y, z) {
  d = "\47"; m = split(str, x, d)
  for (y in x) z = z d x[y] d (y < m ? "\\" d : "")
  return z
}

예:

system(sprintf("date -d %s +%%s", quote($0)))

원천

관련 정보