以下の出力からのみデータを取得しようとしています。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.44TB
2つのレコードに分けられますTotal: 44.75TB
。Used: 0.44TB
FS=": ?"
フィールド区切り文字をコロンに設定し、オプションで、後ろにスペースを追加します。これはUsed: 0.44TB
2つのフィールドに分け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'
数字、ドット、スペース、改行文字を除くすべての項目が削除されます。