awk에 전달된 변수 수를 얻는 방법

awk에 전달된 변수 수를 얻는 방법

bash 스크립트에서 awk를 호출하고 bash 변수 값을 전달하려고 합니다. 이러한 변수의 수를 가져오고 awk에서 전달된 모든 변수를 인쇄하는 방법이 있습니까?

awk에 전달되는 변수의 수는 동적입니다.

아래 예

#!/bin/bash
NAME="Dell"
SERIAL="12345"
echo "Hello" | awk -v a=$NAME -v b=$SERIAL '{ print a,b }'

참조, 작업 예, Irvur의 답변은 여기에 있습니다.

#!/bin/bash

function confirm_peers (){
  header_def=("${header_def[@]:-None}")
  read -r -p "Enter nodes from header[${header_def[*]}]: " -a header
  header=("${header[@]:-${header_def[@]}}") ;
  echo -e "\nInput Recorded - ${header[@]} \n"
}

createEncConfig()
{
 /usr/bin/awk -f - <<-'EOE' ${header[*]}  FS=":" $1
  BEGIN {
    count=1
    for (i = 1; i < ARGC - 2; ++i) {
    split(ARGV[i], ar, "=");
    print ar[2]
    }
print "\nCount=" ARGC -3
        }
EOE
}
confirm_peers
# Making array content adaptable to awk input
for x in ${!header[@]} ; do header[x]="a=${header[x]}"; done
createEncConfig $1

참조 - 지금까지 가장 쉬운 Kusalananda의 답변

#!/bin/bash

function confirm_peers (){
  header_def=("${header_def[@]:-None}")
  read -r -p "Enter nodes from header[${header_def[*]}]: " -a header
  header=("${header[@]:-${header_def[@]}}") ;
  echo -e "\nInput Recorded - ${header[@]} \n"
}

createEncConfig()
{
/usr/bin/awk -v args="${header[*]}" -f - <<-'EOE' FS=":" $1
BEGIN {
  count=split(args,ar," ")
  for ( x in ar ) {
    print ar[x]
  }
print "\n" count
}
EOE
}
confirm_peers
createEncConfig $1

출력: 더미 파일을 전달하세요.

$bash /tmp/a.bsh /tmp/enc1.txt

Enter nodes from header[None]: a b c d

Input Recorded - a b c d

a
b
c
d

Count=4

다들 감사 해요..

답변1

내가 생각할 수 있는 한 가지 옵션은 이러한 변수 가 에 나타나도록 위치를 변경하는 것입니다 ARGV. 이렇게 하면 블록 내에서 ARGC변수를 사용할 수 없게 됩니다 . BEGIN또한 인수로 전달한 파일 이름에 대해 awk해당 파일 수를 빼서 설명해야 합니다.ARGC

echo "Hello" | awk  '{ print a, b, ARGC - 1}' a=$NAME b=$SERIAL
DELL 12345 2

답변2

~에서귀하의 의견, 명령줄에서 프로그램 bash에 전달하려는 배열이 있는 것 같습니다 .awk

간단한 방법은 다음과 같습니다.

array=("my 1st item" "my 2nd item" "the last item")

(
    IFS=:

    awk -v var="${array[*]}" '
        BEGIN {
            array_len = split(var, array, ":")
            for (i = 1; i <= array_len; ++i)
                printf("Item #%d is \"%s\"\n", i, array[i])
        }'
)

이것은 출력됩니다

Item #1 is "my 1st item"
Item #2 is "my 2nd item"
Item #3 is "the last item"

그러면 배열을 가져와 :- 로 구분된 항목으로 구성된 단일 문자열로 변환합니다. 배열의 요소에 가 포함된 경우 :문자열의 항목을 구분하기 위해 다른 문자가 선택됩니다. 확장은 ${array[*]}배열의 항목을 첫 번째 문자에 연결하므로 $IFS확장을 수행하기 전에 이 변수를 설정합니다. 문자열은 awk변수로 전달됩니다 var.

프로그램 BEGIN블록 에서 awk배열을 생성하고 이를 나누어 배열의 길이를 추적합니다 array. 이 루프는 문자열을 성공적으로 분할했음을 보여주기 위한 것입니다.array_lenvar:

수정되지 않은 변수를 사용하여 스크립트의 나머지 부분을 실행할 수 있도록 하위 쉘에서 프로그램을 설정 IFS하고 실행합니다 .awkIFS

답변3

이제 자신만의 명령줄과 해당 옵션을 얻을 수 있는 방법이 제공되지 않기 때문에 이것은 파일 시스템과 같은 Linux 내부 awk에 의존하는 약간의 확장이지만 단지 재미를 위한 것입니다(YMMV).proc

awk -v"VAR1=sd" -va=b -vJ=onny '
BEGIN   {("tr \47\\000\\n\47 \47\t\47 </proc/$PPID/cmdline") | getline CMDLN
         n = split (CMDLN, ELM, "\t")
         for (i=1; i<=n; i++)   if (sub ("^-v", "", ELM[i]))    {split (ELM[i], T, "=")
                                                                 print "Option", T[1], "=", T[2]
                                                                 Options++
                                                                } 
        }
'
Option VAR1 = sd
Option a = b
Option J = onny

읽고 있는 "명령"은 getline하위 쉘에서 실행되므로 상위 PID의 명령줄과 s 및 tr문자를 얻습니다. 그런 다음 CMDLN은 해당 요소로 이동하여 각 요소의 선행 "-v"를 일치(및 제거)하여 변수 정의를 찾습니다. 이것이 인쇄되고 옵션 수가 증가합니다. 시도 해봐.<NUL><LF><TAB>split

답변4

bash 배열이 있고 bash는 배열에 몇 개의 요소가 있는지 알고 있으므로 awk에 직접 알려주십시오.

$ array=("my 1st item" "my 2nd item" "the last item")
$ awk -v var="${array[*]}" -v nargs=${#array[@]} '
  BEGIN {
    print nargs;
  }
'
3

관련 정보