![시스템 호출, AWK 및 외부 입력 도입](https://linux55.com/image/48833/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%ED%98%B8%EC%B6%9C%2C%20AWK%20%EB%B0%8F%20%EC%99%B8%EB%B6%80%20%EC%9E%85%EB%A0%A5%20%EB%8F%84%EC%9E%85.png)
awk '{ TEMPVAR="/usr/bin"; printf("%s", system("ls $TEMPVAR")); }' empty
TEMPVAR
이 예에서는 호출 에 변수를 도입하려고 합니다 system
. 어떻게 해야 합니까?
내 목표는 다음과 같습니다. 파일의 각 줄에서 발생하는 호출을 사용 하려고 합니다 date -d $0 +%s
. 그러나 해당 값을 시스템 호출에 system
넣는 방법에 어려움을 겪고 있습니다 .$0
답변1
awk
ENVIRON
환경 변수는 특수 배열을 사용하여 액세스할 수 있습니다 . 그러나 배열 요소에 값을 할당할 수는 있지만 awk
's system
또는 | getline
실행된 명령 의 컨텍스트에서는 전달되지 않습니다 print |
. 이 배열은 다음 용도로만 ENVIRON
사용됩니다.awk
얻다전달하는 환경 변수의 값입니다.
을 수행할 수 있지만 system("ls " var)
의 (또는 또는 )에 전달된 문자열은 실제로 인수로 전달되므로 쉘 코드로 해석됩니다.awk
system()
print |
| getline
sh -c
예를 들어, awk
var
변수에 가 포함되어 있으면 호출된 파일을 나열 foo;rm -rf /
하라는 지시가 아니라 호출된 파일을 나열한 다음 명령을 실행하라는 지시를 받습니다.ls
"foo;rm -rf /"
foo
rm
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)))