필터링 중인 일부 데이터를 반복하려고 합니다. 그러나 전체적으로는 한 번만 순환됩니다.
내 샘플 데이터:
1.1G user1
2.2G user2
3.3G user3
무엇을 하고 있는지:
1.1
2.2
3.3
hi
내가 원하는 것:
1.1
hi
2.2
hi
3.3
hi
이것이 내가 사용하는 것입니다:
hdSize=$(du -h --max-depth=1 /home/users | awk '$1~/T|G/' | sed '$d')
gbSize=$(echo $hdSize | awk '{print $1}' | tr -d "G")
for sizeAlert in $gbSize
do
echo $sizeAlert
echo "hi"
done
답변1
Bash를 실행하는 경우 echo $hdSize
변수를 공백으로 분할하고 부분을 공백과 결합하여 모든 것을 한 줄로 효과적으로 접습니다. 파이프라인에서는 하나의 필드만 가져옵니다.
대신 Zsh를 실행 중이거나 IFS
설정이 비어 있으면 변수가 분할되지 않으며 파이프라인이 예상대로 작동해야 합니다. 반면, 이러한 경우 $gbSize
루프는 분할되지 않고 for
한 번만 실행됩니다.
줄 바꿈 문자가 그대로 유지되도록 두 번째 파이프의 변수를 참조하여 Bash의 첫 번째 사례를 수정할 수 있습니다 echo "$hdSize" | ...
. 하지만 아직 좋지는 않습니다.
디렉토리 이름으로도 뭔가를 하고 싶다고 가정하면 두 디렉토리 이름을 모두 가져오려면 루프가 필요합니다. 가장 간단한 방법은 필드를 행에서 변수로 분할할 수 있는 실행 루프 du
의 출력을 파이프하는 것입니다 .while
read
du -BG --max-depth=1 /home/users | sed -e '$d' -e 's/G/ /' |
while read size dir; do
printf "directory %s is %d gigs\n" "$dir" "$size";
if [ "$size" -gt 1024 ]; then
printf "that's a lot.\n"
fi
done
du -BG
값에 관계없이 항상 크기를 기가바이트 단위로 가져오곤 했습니다. 비교와 산술이 더 쉬워집니다.
답변2
$1~/G/ 앞에 $1을 인쇄하여 작동하도록 했습니다.
hdSize=$(du -h --max-깊이=1 /home/users | awk '{print $1}' | awk '$1~/T|G/' | sed '$d')