내 파일에는 Threadout.txt
다음과 같은 내용이 포함되어 있습니다.Thread 1/1/25/100
val1=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $1}')
val2=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $2}')
val3=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $3}')
val4=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $4}')
for((i=1;i<5;i++))
do
val[i]=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $[i]}')
echo $val[i]
done
이 배열을 시도했지만 1 1 25 100
값과 같은 올바른 결과를 제공하지 않습니다. 오류가 있나요?
답변1
코드에 몇 가지 문제가 있습니다.
- 기억해야 할 첫 번째 중요한 점은
awk
프로그램이 작은따옴표로 묶여 있기 때문에(권장됨) 쉘 매개변수 확장이 발생하지 않으며 명령문이print $[i]
작동하지 않는다는 것입니다. 이것 좀 봐StackOverflow에 대한 자세한 Q&Aawk
프로그램에서 쉘 매개변수를 사용하는 방법에 대해 설명합니다 . - 그렇더라도 ( ) 변수
awk
에 번호가 저장된 필드 는 가 아닌 으로 주소가 지정 됩니다 .awk
n
$n
$[n]
val1
변수를 할당val4
하지만 실제로는 사용하지 않으므로 스크립트 예제의 첫 번째 부분에서는 아무 작업도 수행하지 않습니다.${val[i]}
마지막으로, 배열 변수를 역참조하려면 , not 을 선언해야 합니다$val[i]
(이렇게 하면 변수의 내용$val
(빈 문자열)과 고정 문자열 이 인쇄됩니다[i]
).
awk
반복적으로 호출하고 (내가 아는 한) 필드 구분 기호로만 사용될 Thread
때 예제 입력의 주요 문제를 해결하지 못하는 등 일부 비효율성도 있습니다 ./
이러한 문제를 해결하려면 예제의 관련 값에 공백이 포함되어 있지 않으므로 다음을 시도해 보십시오.
#!/bin/bash
val=( $(awk '/^Thread/{n=split($2,a,/\//); for (i=1;i<=n;i++) printf("%s%s",a[i],OFS)}' Threadout.txt) )
for i in ${!val[@]}
do
echo "${val[i]}"
done
- 이 호출은 배열에 있는 부분 인
awk
행의 두 번째 "필드"를 분할 하고 배열의 모든 항목을 (기본값은 공백)로 구분하여 인쇄합니다.Thread 1/1/25/100
1/1/25/100
/
a
OFS
- 쉘 스크립트는 공백으로 구분된 토큰 목록이기 때문에
awk
명령문을 통해 각 토큰을 배열 변수에 할당하여 이 프로그램의 출력을 가져옵니다.val
val=( ... )
- 그런 다음 배열 인덱스를 반복하고 배열 값을 인쇄합니다.
더 많은 bash 배열을 읽고 싶을 수도 있습니다.GNU Bash 참조 매뉴얼, 또는GreyCat&Lhunath의 배쉬 가이드. 저도 꼭 보시길 추천드려요주택 검사쉘 스크립트를 디버그하십시오.