フィルタリング中の一部のデータを繰り返そうとしています。しかし、全体的には一度だけ循環します。
私のサンプルデータ:
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
変数をスペースに分割し、部分をスペースと組み合わせて、すべてを1行に効果的に折りたたみます。パイプラインは1つのフィールドのみを取得します。
代わりにZshを実行している場合、またはIFS
設定が空の場合、変数は分割されず、パイプラインは期待どおりに機能するはずです。一方、このような場合、$gbSize
ループは分割されず、for
一度だけ実行されます。
改行文字がそのまま残るように、2番目のパイプの変数を参照して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')