この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 出力を解析する必要があることが判明しました。これは次のように実行されます (ユーザーの要求どおり)。

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: 」の後の最初のスペース以外の単語を検索し、文字列全体をその単語に置き換えます。

関連情報