![このawkコマンドを動作させる方法](https://rvso.com/image/76427/%E3%81%93%E3%81%AEawk%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%8B%95%E4%BD%9C%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95.png)
以下のコマンドを実行したいのですが、実行できません。こちらを確認してください:
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: 」の後の最初のスペース以外の単語を検索し、文字列全体をその単語に置き換えます。