「df」出力の「grep」空き容量

「df」出力の「grep」空き容量

こんにちは、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番目のフィールドが印刷されるようにします。-nsda3/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)に変換し、grep4番目のフィールドを印刷するために使用します。

答え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のバージョンによっては、-ofor onlyと-Eforを使用して正規表現を拡張することもできます。

だからあなたは使用することができます

df | grep /dev/sda3 | grep -E -o "[[:digit:]]+[[:space:]]+[[:digit:]]+%" | grep -E -o ".+\s"

これには、%最初のgrepのアンカーとしてcharが必要です。その後、2番目のgrepのためのスペースまで最初の文字を取得します。

関連情報