bashコマンドから部分文字列を取得する方法


8

コマンドから取得した次の部分文字列があるとしますdf /dev/sdb1 | tail -n 1

/dev/sdb1 1952971772 1441131032 511840740 74% /media/kaiman/ShareData

私は、抽出したい195297177274%、その文字列から、bashスクリプトでそれを使用します。

一部のカットコマンドなどを使用できることはわかっていますが、たとえばサイズが変更されると機能しなくなります。

私も正規表現か何かを使用することについて考えましたが、私は最も推奨されるアプローチを持ちたいと思います。

前もって感謝します!


2
あなたは一般的なケースについて、またはdf特にについて尋ねていますか?後者の場合、特定の出力フィールドを明示的に指定できます。例df --output=pcent /dev/sdb1
Steeldriver

2
cut行の文字位置を使用しているため、ファイルサイズの変動によって行の長さが変化すると失敗します。私は、あなたが言うことができると信じてcut列を選択する2と、列5スペースで区切らを、私は電話でだと研究し、効果的に答えを投稿することはできません。
WinEunuuchs2Unix

1
@ WinEunuuchs2Unixスペースの数は異なる場合があるため、どの列番号が正しいのかを判断するのは困難です。cut各区切り文字の後に1つの列が表示されます。
mook765

2つ以上の連続するスペースは、列を
区切る

@ WinEunuuchs2Unix正しい:)私が手元にあるテキストファイルからのコマンド:D
Rinzwind

回答:


6
$ df /dev/sdb1 | awk '{ print $5 }' | tail -n 1

割合と

$ df /dev/sdb1 | awk '{ print $2 }' | tail -n 1

サイズについて。

なしtail

df /home | awk 'NR==2 { print $2 }'
df /home | awk 'NR==2 { print $5 }'

  • awk '{ print $2 }'
    複数のセパレーターが1としてカウントされる2番目の列を取得します。したがって、2番目の列は、コマンドの最初の部分のシステムでは常に同じです。

  • NR 処理中のレコードの総数または行番号を示します。


1
または、両方が1行で必要な場合df /home | awk '{print $2; print $5;}'
Videonauth

3
AwkはENDブロックの最後の行を保持するので、tail単に使用するのではなくawk 'END { print $2,$5}'
Kevin

FYI私の名前はメタ:)であなたを落としmeta.askubuntu.com/questions/18584/...
WinEunuuchs2Unix

8

編集された回答

@kevinが述べたように、を使用awkして最後の行のみを選択し、tailをまったく使用ENDしないようにすることができます。また、2つの列を一度に印刷する場合は、次のようにすることができます。

df /dev/sdb1 | awk 'END {print $2,$5}'
1952971772 74%

元の答え

2列目のみ選択できます。

$ df /dev/sdb1 | tail -1 | awk '{print $2}' 
1952971772

どこ$2TABの位置が列を分離を示しています。cutTABの1つのオカレンスのみを処理し、列を区切るために複数のTABがあるため、これを使用できます。


3
AwkはENDブロックの最後の行を保持するので、tail単に使用するのではなくawk 'END { print $2,$5}'
Kevin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.