Linuxでgrepを使用して特定の一致した(サブ)値を返す


0

UbuntuでZabbixエージェント(ロギングソフトウェア)を実行していますが、内部IPIP / GREトンネルにpingを実行して、接続の品質を常に測定したいと考えています。

現在、Zabbixエージェントでは、デフォルトでは内部トンネルに対してpingコマンドを実行できませんが、幸いなことに「ユーザーパラメーター」を作成できます。基本的には、単一のUNIXシェルコマンドを実行してデータをソフトウェアにフィードできます。

そのためには、zabbixの単一の値を取得するfping / pingコマンドを実行する必要があります。この値は、10進数の秒数または待機時間のミリ秒数、または1秒以上何も接続しない場合は0にする必要があります。以下では、トンネルIPに対して5つのpingを実行してから平均値を返すコマンドを既に作成しました。

(以下のIPアドレスはデータ例です)これは私がこれまでに得たものです:

fping -e -q -p 1000 -c 5 8.8.4.4 2> /dev/null | grep -oP '[0-9\.]+/([0-9\.]+)/[0-9\.]+$'

完全な戻り文字列は次のようになります。

8.8.4.4 : xmt/rcv/%loss = 5/5/0%, min/avg/max = 2.78/2.94/3.19"

grepの結果は次のとおりです。

2.78/2.94/3.19

私は一貫して2番目の値(上記2.94)を取得したいのですが、私の質問は、単一のコマンドでこれを行う最も効果的な方法は何ですか?

回答:


1

sed代わりに使用するgrepため、フィルタは次のようになります。

... | sed -n 's%^.* = .* = .*/\(.*\)/.*%\1%pg'

ノート:-

  • /文字を照合し%ているため、エスケープする必要を避けることで式を単純化するために、通常の文字列区切り文字を置き換えました/
  • 私たちは、全体のラインに一致すると2つので区切られた看板、等しい後に2つのスラッシュの間に来るもので、それを交換する\(と、\)一致文字列にして\1交換しています。
  • -n一致する行()を除き、何も出力しません(%pg)。

説明を簡単にする.*ために、数字に使用しました。を使用できますが[0-9\.]+、拡張REを使用する必要がありますgrep -rn ...

sed以前に使用したことがない場合は、このチュートリアルをお勧めます。


返信いただきありがとうございます。ただし、次のコマンドを実行すると、空の結果が表示されます。fping -e -q -p 1000 -c 5 8.8.4.4 | sed -n 's%^。* =。* =。* /(。*)/.*% \ 1%pg'ただし、コマンドを手動で実行し、結果をエコーでコピーすると、機能します私は間違っていますか?
ロビングールド

どうやらfpingは常にstdinではなくstderrに出力するので、fpingコマンドの最後に2>&1を含めることでこれを解決しました
ロビングールド

bashリダイレクトをに短縮できますfping ... |& sed ...
AFH

0

どうしてcut -d/ -f8?次のように:

echo '8.8.4.4 : xmt/rcv/%loss = 5/5/0%, min/avg/max = 2.78/2.94/3.19"' | cut -d/ -f8

これもうまくいきましたが、sedソリューションはより柔軟に見えます:とにかくありがとう!
ロビングールド

からの出力に異なる形式の余分な行がない限り、これは良い解決策fpingです:入力の各余分な行cutは出力に空白行を与えます。これらを排除するには、追加のフィルターが必要... | grep -v '^$'です。
AFH

もちろん、sedまたはawk働いていた-私は述べられた問題に最も簡単な答えを提供しようとしました:)
Richlv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.