処理されたクエリから次の詳細があります:

queuename qtype resv/used/tot. np_load arch states --------------------------------------------------------------------------------- abax55@lp55cs008 BP 0/36/36 1.08 lx-amd64 gf:app_monitor=1 gf:app_abaqus=1 gf:app_abaqusfgs=1 gf:app_actran=1 hl:load_avg=38.980000 hl:load_short=38.550000 hl:load_medium=38.980000 hl:load_long=39.030000 

Iプレフィックスabax55@lp55cs008が付いたhl:load_avg=38.980000のみをgrepする場合、出力は次のようになります。

abax55@lp55cs008 - hl:load_avg=38.980000 

….これはcs008という名前の1台のマシン専用です。マシンの総数は100以上になります。

2つのオプションを提案してください:

  1. 特定のマシンのみをgrepする場合、
  2. すべてをgrepする場合マシン

コメント

  • すべてのマシンのgrep -すべてのマシンの命名規則は何ですか?名前に共通のプレフィックスがありますか?
  • abax55 @ lp55cs001 abax55 @ lp55cs002 abax55 @ lp55cs003 abax55 @ lp55cs004 ….など!
  • この質問全体に対する唯一の入力' abax55 'である必要があり、残りはすべてシェルで行う必要があります
  • 質問はまだ不明であり、それはgrepですか? 1つのケースでgrepが簡単な場合は、結果の前にそのテキストを印刷します
  • grep rep -o "hl:load_avg=38.980000" machines | xargs -L 1 echo "abax55@lp55cs008 -"を使用するか、awk awk 'match($0,/hl:load_avg=38.980000/) { print "abax55@lp55cs008 - " substr($0,RSTART,RLENGTH) }' machines

回答

Awk ソリューション:

1)特定のマシンのみをgrepする場合:

awk -v m="cs008" "/abax55@lp55cs[0-9]/ && $1 ~ m{ m_name=$1 } m_name && /hl:load_avg=/{ print m_name" - "$1; exit }" file 

出力:

abax55@lp55cs008 - hl:load_avg=38.980000 

2)すべてのマシンをgrepする場合:

awk "/abax55@lp55cs[0-9]/{ m_name=$1 } m_name && /hl:load_avg=/{ print m_name" - "$1; m_name=0 }" file 

コメント

  • コマンド全体を1行で実行することは可能ですか?
  • @Nayak、質問を詳しく説明します。あいまい
  • ' awk -vm = " cs008 " ' / abax55 @ lp55cs [0-9] / & & $ 1 〜m {m_name = $ 1} awk -vm = " cs008 " ' / abax55 @ lp55cs [0-9] / & & $ 1〜m {m_name = $ 1} ' 1行で?
  • はい。これはすべて1行で実行できます。引用符で囲まれたawkスクリプトの改行を;文字に置き換えます。 (newlineと;のいずれかまたは両方を使用して、awkのステートメントを区切ることができます。)
  • 非常に単純なソリューション実行時間が短い….ありがとうございました

回答

テスト用に同じコンテンツを挿入しましたファイル内のホスト名を変更することにより、ファイル内で複数回

input file queuename qtype resv/used/tot. np_load arch states --------------------------------------------------------------------------------- abax55@lp55cs008 BP 0/36/36 1.08 lx-amd64 gf:app_monitor=1 gf:app_abaqus=1 gf:app_abaqusfgs=1 gf:app_actran=1 hl:load_avg=38.980000 hl:load_short=38.550000 hl:load_medium=38.980000 hl:load_long=39.030000 queuename qtype resv/used/tot. np_load arch states --------------------------------------------------------------------------------- abax55@lp55cs009 BP 0/36/36 1.08 lx-amd64 gf:app_monitor=1 gf:app_abaqus=1 gf:app_abaqusfgs=1 gf:app_actran=1 hl:load_avg=38.980000 hl:load_short=38.550000 hl:load_medium=38.980000 hl:load_long=39.030000 queuename qtype resv/used/tot. np_load arch states --------------------------------------------------------------------------------- abax55@lp55cs007 BP 0/36/36 1.08 lx-amd64 gf:app_monitor=1 gf:app_abaqus=1 gf:app_abaqusfgs=1 gf:app_actran=1 hl:load_avg=38.980000 hl:load_short=38.550000 hl:load_medium=38.980000 hl:load_long=39.030000 

コマンド

 for i in `sed -n "/abax55@lp55cs/p" file.txt |awk "{print $1}"`; do sed -n "/$i/,+5p" file.txt | awk "{print $1}" | sed -n -e "1p" -e "$p" | perl -pne "s/\n/-/"| sed "s/-$/\n/g"; done 

出力

abax55@lp55cs008-hl:load_avg=38.980000 abax55@lp55cs009-hl:load_avg=38.980000 abax55@lp55cs007-hl:load_avg=38.980000 

コメント

  • @Nayak回答に投票できますか

回答

grepは使用しませんperl

#!/usr/bin/env perl use strict; use warnings; use Data::Dumper; my %values = do { local $/; <> } =~ m/(\w+\@\w+).*?hl:load_avg=([\d\.]+)/gms; print Dumper \%values; print $values{"abax55@lp55cs008"} 

より具体的なレコード形式を指定できれば、おそらくそれを改良できます。ただし、新しい「ブロック」ごとに先頭に空白がないため、スタンザ全体を簡単にブロックに解析できます(空白行など、レコード間に明確な区切り文字があると、表示されなくてもさらに簡単になります)。あなたの出力は私にはわかりません。

#!/usr/bin/env perl use strict; use warnings; use Data::Dumper; my $current_host = ""; my %values; #<> reads stdin or files specified on command line. #if that doesn"t work for you, you can "open" a specific file, or #use qx() or backticks to run a a command. while ( <> ) { #match a regex and capture the result if it"s valid. if ( m/^(\w+\@\w+)/ ) { $current_host = $1 }; #lines that start with whitespace are the values. if ( m/^\s+(\w+:\w+)=([\d\.]+)/ ) { #$1 and $2 are captured via the brackets $values{$current_host}{$1} = $2; } } #for debug: print Dumper \%values; #to print a specific key: my $target_key = "hl:load_avg"; foreach my $host ( sort keys %values ) { print "$host - $target_key=",$values{$host}{$target_key},"\n"; } 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です