こんにちは、grep dfの出力が必要です。残念ながら、awkはオプションではなく(単純なオプションにもかかわらず)、ここではgrepのみを使用できます。
Filesystem 1K-blocks Used Available Use% Mounted on
none 4 0 4 0% /sys/fs/cgroup
none 5120 0 5120 0% /run/lock
none 1981488 444 1981044 0% /run/shm
none 102400 64 102336 0% /run/user
/dev/sda3 418176236 281033024 137143212 67% /media/mark/7EE21FBAE21F761D
たとえば、/dev/sda3 で始まる行に $4 列が必要です。
答え1
-P
(perl準拠の正規表現、PCRE)、および(一致する文字列のみを印刷)をサポートするgrepバージョンがある場合は、-o
次のことができます。
df | grep -oP '/sda3.* \K\d+(?=\s+\d+%)'
説明する
ここでは、を一致させてから、/sda3
ピリオド(\d+
)、1つ以上のスペース(\s+
)、1つ以上の数字(\d+
)、およびaが表示されるまで、できるだけ多くの文字を一致させます%
。構成foo(?=bar)
は肯定的な見通しfoo
、文字列が続く場合にのみ文字列を検索できますbar
。これは\K
、「これまで一致するすべてのアイテムを削除」を意味するPCREトリックです。と一緒に使用すると、-o
パターンの前の文字列を使用して一致を固定できますが、印刷することはできません。
そうでなければ、-P
状況はより難しくなります。何度も通過する必要があります。たとえば、
df | grep -o '/sda3.*%' | grep -Eo '[0-9]+ *[0-9]+%' | grep -Eo '^[0-9]+'
説明する
ここで最初はgrep
正しい行を識別してまで印刷します%
。 2番目は空白の前に最も長い数字を印刷し、で終わる別の数字セグメントを印刷し、%
最後は行の先頭で見つかった最も長い数字を印刷します。以前のバージョンでは、使用可能なスペースとパーセンテージのみが印刷されていたため、これは使用可能なスペースです。
grep
これをサポートしていない場合は、次-E
のようにできます。
df | grep -o '/sda3.*%' | grep -o '[0-9]* *[0-9]*%' | grep -o '[0-9][0-9]* '
説明する
ここでは+
「one or more」は使用できないため、最後の数字にはgrep
少なくとも1つの数字と0以上の数字([0-9][0-9]*
)を指定する必要があります。
もちろん、自由に使用できる他のツールがあれば、作業がはるかに簡単になります。
df | sed -n '/sda3/{s/ */ /gp}' | cut -d' ' -f4
説明する
現在の行が()と一致しない限り何も印刷されず、sed
一致する場合は、連続するすべてのスペースを単一のスペースに置き換えて、4番目のフィールドが印刷されるようにします。-n
sda3
/sda3/{}
cut
または
df | perl -lne 'm#/sda3.+\s(\d+)\s+\d+%# && print $1'
説明する
-l
各印刷呼び出しに改行を追加します。これは-n
「入力を1行ずつ読み取る」を意味し、-e
コマンドラインからスクリプトを渡すことができます。スクリプトは、それ自体が一致しsda3
てから、空白までの文字シーケンス、1つ以上の数字(\s(\d+)
)、スペース、%
()\s+\d+
で終わる一連の数字の順に一致します。括弧は興味のある部分をキャプチャしてから$1
。
または
df | tr -s ' ' $'\t' | grep sda3 | cut -f4
説明する
ここでは、tr
複数の連続した空白をタブ(sda3のデフォルトの区切り文字cut
)に変換し、grep
4番目のフィールドを印刷するために使用します。
答え2
使い方 grep
お客様がリクエストした方法で解決して回答をいただきました。
この答えは解決策についてです。はいQ - 個々の値を取得します。 df
:
GNUには、出力に表示される列を指定するdf
オプションがあります。coreutils
$ df --output=avail /dev/sda3
Avail
9816416
残念ながら、列ヘッダーを抑制するオプションがないため、次の追加手順で削除する必要がありますtail
。
$ df --output=avail /dev/sda3 | tail -n 1
9816416
または必要にgrep
応じて:
$ df --output=avail /dev/sda3 | grep '[0-9]'
9816416
答え3
grepのバージョンによっては、-o
for onlyと-E
forを使用して正規表現を拡張することもできます。
だからあなたは使用することができます
df | grep /dev/sda3 | grep -E -o "[[:digit:]]+[[:space:]]+[[:digit:]]+%" | grep -E -o ".+\s"
これには、%
最初のgrepのアンカーとしてcharが必要です。その後、2番目のgrepのためのスペースまで最初の文字を取得します。