A következő részletek vannak a feldolgozott lekérdezésből:
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 csak hl:load_avg=38.980000
-t akarja megkaparintani a abax55@lp55cs008
előtaggal, vagyis a kimenetnek így kell kinéznie:
abax55@lp55cs008 - hl:load_avg=38.980000
…. ez csak egy cs008
nevű gépre vonatkozik. és a gépek teljes száma 100+ lenne.
Kérjük, javasoljon 2 lehetőséget:
- csak egy adott gép megpiszkálásához,
- az összes megmunkálásához gépek
Megjegyzések
Válasz
Awk
megoldás:
1) csak egy adott gép befogásához:
awk -v m="cs008" "/abax55@lp55cs[0-9]/ && $1 ~ m{ m_name=$1 } m_name && /hl:load_avg=/{ print m_name" - "$1; exit }" file
A kimenet:
abax55@lp55cs008 - hl:load_avg=38.980000
2) az összes gép befogásához:
awk "/abax55@lp55cs[0-9]/{ m_name=$1 } m_name && /hl:load_avg=/{ print m_name" - "$1; m_name=0 }" file
megjegyzések
- lehetséges-e a teljes parancs futtatása egyetlen sorban?
- @Nayak, fejtse ki kérdését, hangzik homályos
- lehetséges-e ' awk -vm = " cs008 " ' / abax55 @ lp55cs [0-9] / & & $ 1 ~ m {m_name = $ 1} awk -vm = " cs008 " ' / abax55 @ lp55cs [0-9] / & & $ 1 ~ m {m_name = $ 1} ' egyetlen sorban?
- igen. ez mind egy vonalon futtatható. Az idézett awk szkript új sorait cserélje le
;
karakterekre. (a newline és a;
vagy mindkettő használható az utasítások szétválasztására aawk
-ban). - nagyon egyszerű megoldás és a futásideje alacsony …. nagyon köszönöm
Válasz
A teszteléshez ugyanazt a tartalmat illesztettem be a fájlban többször is, megváltoztatva a fájl gazdagépneveit
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
parancs
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
kimenet
abax55@lp55cs008-hl:load_avg=38.980000 abax55@lp55cs009-hl:load_avg=38.980000 abax55@lp55cs007-hl:load_avg=38.980000
Megjegyzések
- @Nayak Tudsz szavazni a válaszra
Válasz
Nem használnám a következőt: 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"}
Valószínűleg finomítani tudom, ha képesek megadni egy konkrétabb rekordformátumot. De az egész strófát elég könnyen blokkba elemezheti, mert minden új “blokk” elején nincs szóköz (még egyszerűbb, ha a rekordok között egyértelmű határoló van, például egy üres sor, de nem látja a kimenetedet nem tudom megmondani, mi lenne ez.
#!/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"; }
rep -o "hl:load_avg=38.980000" machines | xargs -L 1 echo "abax55@lp55cs008 -"
vagy az awkawk 'match($0,/hl:load_avg=38.980000/) { print "abax55@lp55cs008 - " substr($0,RSTART,RLENGTH) }' machines
használatával