GNU awk 사용

GNU awk 사용

Bash에는 $0스크립트 이름이 있지만 awk에서는 다음 내용으로 myscript.awk라는 스크립트를 생성합니다.

#!/usr/bin/awk -f
BEGIN{ print ARGV[0] }

실행하면 "awk"만 인쇄됩니다. 또한 i>0인 ARGV[i]는 명령줄의 스크립트 인수에만 사용됩니다. 그렇다면 스크립트 이름(이 경우 "myscript.awk")을 인쇄하려면 어떻게 해야 합니까?

답변1

Cygwin의 bash에서 GNU awk 4.1.3 사용:

$ cat tst.sh
#!/bin/awk -f
BEGIN { print "Executing:", ENVIRON["_"] }

$ ./tst.sh
Executing: ./tst.sh

휴대성이 얼마나 좋은지 전혀 몰랐습니다. 그러나 항상 그렇듯이 awk 스크립트를 실행하기 위해 쉘 스크립트에서 shebang을 사용하지는 않을 것입니다. 왜냐하면 이는 단지 가능한 기능을 빼앗아갈 뿐이기 때문입니다. 간단하게 다음과 같이 하세요.

$ cat tst2.sh
awk -v cmd="$0" '
BEGIN { print "Executing:", cmd }
' "$@"

$ ./tst2.sh
Executing: ./tst2.sh

마지막 것은 모든 플랫폼의 모든 쉘에서 최신 awk와 작동합니다.

답변2

awk에서 명령 이름을 얻는 직접적인 방법을 모르겠습니다. 그러나 서브셸을 통해 찾을 수 있습니다.

멍하니

GNU awk 및 ps명령을 사용하면 프로세스 ID를 사용하여 PROCINFO["PID"]해결 방법으로 명령 이름을 검색할 수 있습니다. 예를 들어:

cmdname.awk

#!/usr/bin/gawk -f

BEGIN {
  ("ps -p " PROCINFO["pid"] " -o comm=") | getline CMDNAME
  print CMDNAME
}

모크 앤 녹

동일한 접근 방식을 사용할 수 있지만 awk특수 쉘 변수(부모의 PID)에서 PID를 파생시킬 수 있습니다.$PPID

cmdname.awk

#!/usr/bin/mawk -f

BEGIN { 
  ("ps -p $PPID -o comm=") | getline CMDNAME
  print CMDNAME
}

시험

다음과 같이 스크립트를 실행하세요.

./cmdname.awk

두 경우 모두 출력:

cmdname.awk

답변3

불가능하다고 생각해요gawk 문서:

ARGV[0]마지막으로 (섹션 7.5 내장 변수 참조)의 값은 운영 체제에 따라 다릅니다. 일부 시스템은 이를 awk거기에 넣고, 일부 시스템은 awk의 전체 경로 이름(예: /bin/awk)을 넣고, 일부 시스템은 스크립트 이름("advice")을 넣습니다. ARGV[0]스크립트 이름을 제공하기 위해 값에 의존하지 마십시오 .

댓글에서 지적했듯이 시도해 볼 수 있는 linux더러운 해킹이 있습니다.스티븐 차제라스awk구현이 NUL 바이트를 지원하는 경우 가능합니다.

#!/usr/bin/awk -f

BEGIN { getline t < "/proc/self/cmdline"; split(t, a, "\0"); print a[3]; }

답변4

GNU awk 사용

조사하다GNU awk 사용자 가이드 - 7.5.2 정보 전달을 위한 내장 변수나는 우연히 다음을 발견했다:

프로그램 정보#

이 배열의 요소는 실행 중인 awk 프로그램에 대한 정보에 대한 액세스를 제공합니다. 다음 요소(알파벳순으로 나열)의 사용이 보장됩니다.

PROCINFO["pid"]

현재 프로세스의 프로세스 ID입니다.

이는 런타임 시 프로그램의 PID를 알 수 있음을 의미합니다. 그런 다음 이 주어진 PID를 사용하여 system()프로세스를 찾아야 합니다.

#!/usr/bin/gawk -f
BEGIN{ pid=PROCINFO["pid"]
       system("ps -ef | awk '$2==" pid " {print $NF}'")
}

을 사용하면 ps -ef두 번째 열에 PID가 표시됩니다. 실행이 완료되고 awk -f <script>추가 매개변수가 없다고 가정하면 행의 마지막 필드에 원하는 정보가 포함되어 있다고 가정할 수 있습니다.

일부 매개변수가 있는 경우 행을 다르게 구문 분석해야 합니다. 또는 더 나은 방법은 일부 옵션을 사용하여 ps관심 있는 열만 인쇄하는 것입니다.

시험

$ awk -f a.awk 
a.awk
$ cp a.awk hello.awk
$ awk -f hello.awk 
hello.awk

또한 GNU awk 사용자 가이드의 다른 장에서는 ARGV가 올바른 선택이 아니라고 말합니다.

1.1.4 실행 가능한 awk 프로그램

마지막으로 ARGV[0]의 값(내장 변수 참조)은 운영 체제에 따라 다릅니다. 일부 시스템에서는 "awk"를 입력하고, 일부 시스템에서는 awk의 전체 경로 이름(예: /bin/awk)을 입력하며, 일부 시스템에서는 스크립트 이름("advice")을 입력합니다. (DC)스크립트 이름을 제공하기 위해 ARGV[0] 값에 의존하지 마십시오.

관련 정보