以下のコマンドが機能したいのですが、できません。確認してください:
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:" の後に空白のない最初の単語を探し、文字列全体をその単語に置き換えます。