1行でegrep -o出力を取得する

1行でegrep -o出力を取得する

以下の出力からのみデータを取得しようとしています。egrepコマンドを使用してデータを除外しようとしていますが、インポートするデータは別の行にあります。 1行のデータをどのように取得できますか?

Total: 44.75TB   Used: 0.44TB    Available:42.04TB       Usage(5% System alocation included):6.07%

これは要件です。

44.75   0.44    42.04       6.07

私たちが試したのは、次のコマンドと出力でした。

# cat output| egrep -o "[+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9]"
44.75
0.44
42.04
6.07

答え1

:それ以降のすべての値を取得し、スペースやタブを使用してリンクしたいようです。

perl選択です

$ perl -lne 'print join "\t",/:\h*\K[^ ]+/g' output
44.75TB 0.44TB  42.04TB 6.07%
  • /:\h*\K[^ ]+/g:a とオプションの水平スペースの後に表示される非スペースの文字を取得します。
    • フィールド区切り記号にタブがある場合は、代わり\Hに使用してください。[^ ]
  • join "\t",一致する文字列は、タブ文字を区切り文字として使用して連結されます。


数字のみを取得する

$ perl -lne 'print join "\t",/:\h*\K[\d.]+/g' output
44.75   0.44    42.04   6.07
  • 数値に数字と小数点のみが含まれており、妥当性を確認しないと仮定すると、次の偶数などのオプションのスペース1.324.4と一致します。...:

答え2

入力行は、それぞれ複数のスペースで区切られた複数のレコードと考えることができます。各レコードは、コロンとスペースを1つに基づいて2つのフィールドに分割できます。私たちはそのような各レコードに2番目のフィールドが欲しいです。

GNUを使用するawk(またはmawk、しかしnawkレコード区切り記号として正規表現が好きではありません):

$ awk -vRS="   *|\n" -vFS=": ?" -vORS=" " '{ print $2 } END { printf("\n") }' data.in
44.75TB 0.44TB 42.04TB 6.07%
  • RS=" *|\n"レコード区切り文字を複数のスペースまたは改行に設定します。これはTotal: 44.75TB Used: 0.44TB2つのレコードに分けられますTotal: 44.75TBUsed: 0.44TB
  • FS=": ?"フィールド区切り文字をコロンに設定し、オプションで、後ろにスペースを追加します。これはUsed: 0.44TB2つのフィールドに分けUsedられます0.44TB
  • ORS=" "設定出力区切り文字をスペースで記録します。

コードawkは各レコードの2番目のフィールドをで区切り、出力でORS改行文字で終了して印刷します。

数字以外のすべてを削除するには、以下を渡しますtr -dc '0-9. \n'

$ awk -vRS="   *|\n" -vFS=": ?" -vORS=" " '{ print $2 } END { printf("\n") }' data.in | tr -dc '0-9. \n'
44.75 0.44 42.04 6.07

tr -dc '0-9. \n'数字、ドット、スペース、改行文字を除くすべての項目が削除されます。

関連情報