このawkコマンドを操作する方法

このawkコマンドを操作する方法

以下のコマンドが機能したいのですが、できません。確認してください:

echo "random string random string mark: abcde random string random string" |
    awk '{gensub(/^.*mark: (.{5,5}).*$/,"\\1","g"); print}'

このコマンドは "abcde"だけを返したいです。ただし、常に完全な入力文字列を返します。なぜ?

答え1

gensub コマンドは文字列を変更しません。結果は関数の出力です。

試してみてください:

echo "random string random string mark: abcde random string random string" |
awk '{print(gensub(/^.*mark: (.{5,5}).*$/,"\\1","g"))}'

編集する:

ユーザーは(ユーザーが要求したように)トップレベルの出力を解析する必要があることがわかりました。

top -b -n 1 -d 1 |
awk 'NR==1{print(gensub(/.*load average: ([0-9\.\, ]+).*$/,"\\1","gs"))}'

注:カンマを小数点区切り文字として使用するロケールには、ドットとコンマの両方を許可します。

mpstatを見てください。ここで紹介したとおり、これはあなたのニーズに適しているかもしれません。

答え2

質問を言い換えると、文字列 "mark:" の後に最初の単語を印刷しようとします。

途中でawkから:

echo "random string random string mark: abcde random string random string" | \
awk -v RS="mark: " 'NR==2{print $1}'

上記のコードは、文字列を「mark:」で区切られた2つのレコードに分割し、2番目のレコードの最初の単語(たとえば「abcde」)を印刷します。

sedから:

echo "random string random string mark: abcde random string random string" | \
sed 's/.*mark: \([^ ]*\).*/\1/'

上記の例では、正規表現を使用して "mark:" の後に空白のない最初の単語を探し、文字列全体をその単語に置き換えます。

関連情報