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 つの名前を取得するため)。