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_len
var
:
수정되지 않은 변수를 사용하여 스크립트의 나머지 부분을 실행할 수 있도록 하위 쉘에서 프로그램을 설정 IFS
하고 실행합니다 .awk
IFS
답변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