自分のファイルがどのデバイスにあるかを確認し、スクリプトで使用できるようにしたいと思います。私はこれを行うことができます:
$ df .
Filesystem 512-blocks Used Available Capacity Mounted on
/dev/disk0s2 498438976 294369520 203557456 60% /
しかし、この出力はあまりにも薄く見えます。 2行目の最初の「単語」を取得するために解析するよりも良い方法はありますか?
私にとって本当に必要なのは、次のコマンドでパイプできるようにすることです。
$ somecommand .
/dev/disk0s2
「df」出力で文字列ハッキングを使用せずにこれを達成するにはどうすればよいですか?
ベストアンサー1
シェルのみを使用してこれを実行できます(bash
、、、、に適用)。dash
ksh
zsh
df . | (read a; read a b; echo "$a")
あるいは、出力を必要とせず(結果は$ aに格納されています)、シェルがプロセス置換をサポートしている場合(例えば、、bash
)zsh
:
{ read; read a b;}< <(df .)
以下は、他のソリューションの速度とのいくつかの比較です。
# pure shell solution 1
bash-4.2$ time for i in $(seq 500); do df . | (read a; read a b; echo "$a"); done > /dev/null
1.899
(dash) $ time -f '%e' dash -c 'for i in $(seq 500); do df . | (read a; read a b; echo "$a"); done > /dev/null'
1.05
(ksh) $ time for i in $(seq 500); do df . | (read a; read a b; echo "$a"); done > /dev/null
0m1.16s real 0m0.02s user 0m0.12s system
(zsh) manatwork% time (for i in $(seq 500); do df . | (read a; read a b; echo "$a"); done > /dev/null)
1.51s
# pure shell solution 2
bash-4.2$ time for i in $(seq 500); do { read; read a b;}< <(df .); done
1.192
(zsh) manatwork% time (for i in $(seq 500); do { read; read a b;}< <(df .); done)
3.51s
# other solutions
bash-4.2$ time for i in $(seq 500); do df . | tail -1 | cut -f 1 -d " "; done > /dev/null
1.405
bash-4.2$ time for i in $(seq 500); do df . | sed '2!d' | awk '{print $1}'; done > /dev/null
5.407
bash-4.2$ time for i in $(seq 500); do df . | sed -n '2{s/ .*$//;p}'; done > /dev/null
1.767
bash-4.2$ time for i in $(seq 500); do df . | sed '2!d' | awk '{print $1}'; done > /dev/null
3.334
bash-4.2$ time for i in $(seq 500); do df . | gawk 'NR==2{print $1}'; done > /dev/null
3.013
bash-4.2$ time for i in $(seq 500); do df . | mawk 'NR==2{print $1}'; done > /dev/null
1.747
bash-4.2$ time for i in $(seq 500); do df . | perl -nae 'print$F[0]if$.==2'; done > /dev/null
2.752
(stat
ここでは動作しないため、ソリューションと比較されません。)