処理されたクエリから次の詳細を取得します。
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
私はhl:load_avg=38.980000
プレフィックスを使ってgrepをしたいと思いますabax55@lp55cs008
。これは、出力が次のようになることを意味します。
abax55@lp55cs008 - hl:load_avg=38.980000
....これは名前付きシステムでのみ機能しますcs008
。マシンの総数は100台を超えます。
2つのオプションを提案してください:
- 特定のマシンに対してのみgrep、
- すべてのマシンをgrepするために使用されます。
答え1
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
答え2
テストのためにファイルのホスト名を変更して、ファイルに同じ内容を複数回挿入しました。
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
答え3
私は使用しませ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";
}