sedおよび複数のawk呼び出しを使用して1行のコードを簡素化する

sedおよび複数のawk呼び出しを使用して1行のコードを簡素化する

パーティション使用率が60%以上の場合にのみ印刷されるように、このコード行を単純化したいと思います。また、使用率の値にパーセント記号を追加したいと思います。

df -h | sed 's/%//g' | awk '{print $6,$5 }' | awk '{ if($2 >=60 ) print}' | column -t

私はBSDバリアントを使用していますが、そうです。いいえ一般的なGNUツールがインストールされました。

答え1

単純なgrepを使用する方が簡単です。 2つの列だけが交換されません。

$ df -h|egrep -o "(100|[6-9].)% /.*$"
65% /
93% /home

答え2

これでフラグが立てられたので、awkこれを修正してみましょう。 1つ目はawk列6と5を列1と2に移動するためのものであるため、それを削除して2番目のawkで列6と5を使用できます。

df -h | sed 's/%//g' | awk '{ if($5 >=60 ) print $6, $5 }' | column -t

パーセント記号を追加することもできます。

df -h | sed 's/%//g' | awk '{ if($5 >=60 ) print $6, $5 "%"}' | column -t

sedawkからこれを削除して実行できます。

df -h | awk '{gsub(/%/,""); if($5 >=60) print $6, $5 "%"}' | column -t

column -tawkは値を配列に格納し、END配列のステートメントループで最も長い名前を見つけてそれに応じて印刷することによってaを削除できますが、one liner私の考えではこれはもはやaではありません.

答え3

両方の呼び出しを1つに置き換えてsed組み合わせることができます。tr -d "%"awk

$ df -h | tr -d "%" | awk '$5 >= 60 { print $6, $5 }' | column -t

ログインした割合を取得するには:

$ df -h | tr -d "%" | awk '$5 >= 60 { printf("%s %s%s\n", $6, $5, (NR>1?"%":"")) }' | column -t

Awkスクリプトの2番目のバージョンは、%1より大きいかどうかに応じて、2番目の出力列に条件付きでaを追加します。 1NRの場合、ヘッダー行なのでNRaを追加しません。%

答え4

Perlが利用可能な場合:

df | perl -nE 'say "$2\t$1"   if /(\d+)% (.*)/ and $1>60'

または

df | perl -nE '/(\d+)% (.*)/ and $1>60 and  say "$2\t$1"'

関連情報