カット/grepとdf -h

カット/grepとdf -h

「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

関連情報