0

私は文字列を持っています:

The disk 'virtual memory' also known as 'Virtual Memory' has exceeded the maximum utilization threshold of 95 Percent.

この文字列の単語を毎回検索する必要がThe diskあり、見つかった場合は、フレーズのみを抽出'*' also known as '*'して変数に入れる必要がありますMONITOR

つまり、検索して値を入れたい

MONITOR="'virtual memory' also known as Virtual Memory'"

どうすればそれを使用できawkますか?

4

2 に答える 2

1

これは、あなたが説明したことを行うスニペットです。$(...)これを $MONITOR 変数に割り当てる必要があります。

$ awk '/The disk '\''.*'\'' also known as '\''.*'\'' has exceeded/ {gsub(/The disk /,"");gsub(/ has exceeded.*$/,"");print}' input.txt

この場合のawkの2つの問題は

  • 正規表現にサブマッチ抽出がありません(これが、私のソリューションがgsub()本文で使用して、行の最初と最後の部分を取り除く理由です。
  • シェルスクリプトでawk正規表現で引用符を使用するには、それをスケープするシーケンスが必要です'\''(詳細はこちら
于 2013-02-11T15:18:45.143 に答える
0

sedよりも少し簡単かもしれませんawk

string="The disk 'virtual memory' also known as 'Virtual Memory' has exceeded the maximum utilization threshold of 95 Percent."

MONITOR=$(echo "$string" | sed -n "/The disk \('[^']*' also known as '[^']*'\) .*/s//\1/p")

awk必要な場合は、次のようにします。

MONITOR=$(echo "$string" | awk "/The disk '[^']*' also known as '[^']*'/ {
                                print \$3, \$4, \$5, \$6, \$7, \$8, \$9; } {}')

空のブレース{}は任意の行に一致し、何も出力しないためawk、正規表現に一致する行のみを処理します。これは、各ディスクに 2 つの単語を含む名前があることを前提としていることに注意してください。gsub正規表現ベースの置換を行うには、より強力な処理 (関数など) を使用する必要があります。これはawkの得意分野ではありません。sedそのタスクには使いやすいです。

どちらのコマンドも、一致しない行が散在する複数行のデータを処理するように設定されています (ただし、一致する情報を含む単一行でも機能します)。また、別々の行の引用符の間に名前を出力することもそれほど難しくありません。これにより、後で行う分析が少なくなります (スペースで区切られた 2 つの名前を取得するため)。

于 2013-02-11T15:23:14.473 に答える