「Verf」の下の「173G」を grep または切り取るにはどうすればよいでしょうか?
学校で Unix スクリプトを書くためにこれが必要です。
jonas@jonaspc:~/$ df -h /dev/sda2
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda2 293G 121G 173G 42% /media/Windows
答え1
このようなタスクに対する最も快適な解決策は次のとおりですawk
。
df -h /dev/sda2 | awk 'NR==2{print$4}'
または、さらにパーティションがリストされている場合は、マウント ポイントによって適切な行を選択できます。
df -h | awk '$1=="/dev/sda2"{print$4}'
も簡単ですsed
が、数回マウントした後にデバッグする必要がある場合は、あまり便利ではありません。
df -h /dev/sda2 | sed -rn '2s/^((\S+)\s+){4}.*/\2/p'
df -h | sed -rn '/^\/dev\/sda2/s/^((\S+)\s+){4}.*/\2/p'
これは GNU を想定していますsed
。POSIX 互換の構文には多くのエスケープが含まれています。
df -h /dev/sda2 | sed -n '2s/^\(\(\S\+\)\s\+\)\{4\}.*/\2/p'
df -h | sed -n '/^\/dev\/sda2/s/^\(\(\S\+\)\s\+\)\{4\}.*/\2/p'
答え2
grep と cut を使用する必要がある場合は、次のようにします。
df -h /dev/sda2 | grep sda | cut -d" " -f14
しかし、これはかなり見苦しいです。スペースを数える必要があるからです (-f14)。@manatwork が awk を使用したのもそのためです。tr
または他のツールを使用して、より見やすくし、カットする実際のフィールドを指定できるようにすることができます。
df -h /dev/sda2 | grep sda | tr -s " " " " | cut -d" " -f4
あるいは、新しい grep は部分一致のみの出力をサポートしており、これを bash トリックと組み合わせて使用できます。
df -h /dev/sda2 | grep -o '[^[:space:]]*G' | cut -d$'\n' -f3
正規表現の方が安全かもしれませんが、これによりすべてのサイズ フィールドが検索され、行ごとに 1 つずつ出力されますが、cut では 2 番目が選択されます。
答え3
他の回答はどれも素晴らしいですが、バッシュawk、sed、grep、cut などの外部プログラムを使用する必要はありません。
次の行は、必要なことを実行します。
{ read; read -r _ _ _ av _; } < <(df -h /dev/sda1)
「$av」/dev/sda1で利用可能なサイズになります
数字部分のみを使用する場合は「$av」(例:123123Gの場合、パラメータ拡張無関係な部分を次のように切り取ります。
ir="${av##*[0-9]}"; echo "${av%$ir}"
または"${av%?}"
、「$av」は1文字だけです。
答え4
grep
/である必要がない場合はcut
、 を使用して同じ情報を取得できる場合がありますstat
。ファイルシステム モードでは、%a
は空きブロックの数と%s
ブロック サイズであり、 は%a * %s
空き領域 (バイト単位) です。これを使用して、好みに応じて計算を実行し、より適切な単位に分解することができます。次に例を示します。
echo $((`stat -f -c "%a*%s" /media/windows/`/1024/1024/1024))GiB