Am următoarele detalii din interogarea procesată:

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 doresc să grep numai hl:load_avg=38.980000 cu prefixul abax55@lp55cs008 ceea ce înseamnă că ieșirea ar trebui să arate ca:

abax55@lp55cs008 - hl:load_avg=38.980000 

…. aceasta este doar pentru o mașină numită cs008. iar numărul total de mașini ar fi mai mare de 100 machines

Comments

  • grepping all machines – care este convenția de denumire pentru toate mașinile? au un prefix comun în numele lor?
  • abax55 @ lp55cs001 abax55 @ lp55cs002 abax55 @ lp55cs003 abax55 @ lp55cs004 …. așa mai departe!
  • singura mea intrare pentru această întreagă carieră ar trebui să fie ' abax55 ', odihnă totul trebuie făcut de către shell
  • Întrebarea ta este încă neclară și trebuie va fi grep? Dacă pentru un caz grepping-ul este ușor, imprimați textul respectiv înainte de rezultat.
  • Folosind grep rep -o "hl:load_avg=38.980000" machines | xargs -L 1 echo "abax55@lp55cs008 -" sau awk awk 'match($0,/hl:load_avg=38.980000/) { print "abax55@lp55cs008 - " substr($0,RSTART,RLENGTH) }' machines

Răspuns

Awk soluție:

1) pentru grepping doar o anumită mașină:

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

Rezultatul:

abax55@lp55cs008 - hl:load_avg=38.980000 

2) pentru grepping-ul tuturor mașinilor:

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

Comentarii

  • este posibil să rulați întreaga comandă într-o singură linie?
  • @Nayak, elaborați-vă întrebarea, sună vag
  • este posibil să ' awk -vm = " cs008 " ' / abax55 @ lp55cs [0-9] / & & $ 1 ~ m {m_name = $ 1} awk -vm = " cs008 " ' / abax55 @ lp55cs [0-9] / & & $ 1 ~ m {m_name = $ 1} ' într-o singură linie?
  • da. acest lucru poate fi rulat pe o singură linie. Înlocuiți noile linii din scriptul awk citat cu caractere ;. (oricare dintre ele sau ambele newline și ; pot fi utilizate pentru a separa declarațiile din awk).
  • soluție foarte simplă iar timpul de rulare este scăzut …. vă mulțumesc foarte mult

Răspundeți

Pentru testare am inserat același conținut în fișier de mai multe ori prin modificarea numelor de gazdă din fișier

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 

comanda

 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 

ieșire

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

Comentarii

  • @Nayak Poți vota pentru răspuns

Răspuns

Nu aș folosi „div id =” 513579df89 „>

Aș folosi 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"} 

Probabil îl pot rafina dacă puteți oferi un format de înregistrare mai specific. Dar puteți analiza întreaga strofă într-un bloc suficient de ușor, deoarece fiecare „bloc” nou nu are spațiu alb la început (este chiar mai ușor dacă există un delimitator clar între înregistrări, cum ar fi o linie goală, dar fără a vedea rezultatul dvs. nu pot să spun ce ar fi asta).

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *