태그를 잡아

태그를 잡아

처리된 쿼리에서 다음 세부정보를 얻습니다.

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가지 옵션을 제안해주세요:

  1. 특정 머신에 대해서만 grep,
  2. 모든 머신을 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

내가 사용하지 않을 grepperl:

#!/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";
}

관련 정보