Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2013-06-19 09:44:39

  bonus - Użytkownik

bonus
Użytkownik
Zarejestrowany: 2009-11-12

[BASH] wiesz wyjścia polecnia lub pliku jako zmienna

Na Xenserver Citrix poleceniem

Kod:

xe vm-list | grep name | awk '{print $4,$5;}' | grep -v ^Control

wynik

Kod:

Debian 6-1
Debian 6-2

Chciałem wykonać pętle na każdej z maszyn oznaczonej powyższą etykietą

Kod:

for MASZYNA in $(xe vm-list | grep name | awk '{print $4,$5;}' | grep -v ^Control); do echo $MASZYNA; done

zmiennej jednak przypisuje się wartość jako ciąg znaków osobno, a nie zawartość wiersza
wynik:

Kod:

Debian
6-1
Debian
6-2

jak zrobić by zmienna przyjęła wartość jako zawartość wiersza wyjścia polecenia?

Offline

 

#2  2013-06-19 09:57:35

  megabajt - Użytkownik

megabajt
Użytkownik
Skąd: Wrocław
Zarejestrowany: 2012-03-07

Re: [BASH] wiesz wyjścia polecnia lub pliku jako zmienna

Kod:

IFS=$'\n'; for MASZYNA in $(xe vm-list | grep name | awk '{print $4,$5;}' | grep -v ^Control); do echo $MASZYNA; done

albo bardziej elegancko:

Kod:

for MASZYNA in $(xe vm-list | grep name | awk '{print $4,$5;}' | grep -v ^Control | xargs -L 1); do echo $MASZYNA; done

Ostatnio edytowany przez megabajt (2013-06-19 10:07:08)

Offline

 

#3  2013-06-19 16:07:23

  bonus - Użytkownik

bonus
Użytkownik
Zarejestrowany: 2009-11-12

Re: [BASH] wiesz wyjścia polecnia lub pliku jako zmienna

Jak należy zastosować, awk aby jako wynik wyświetlił mi parametry od $4 w prawo tj. do któregoś lub do ostatniego. Powyższe polecenie sprawdzi się tylko w przypadku dwuwyrazowej nazwy etykiety maszyny wirtualnej.

Offline

 

#4  2013-06-19 17:03:12

  megabajt - Użytkownik

megabajt
Użytkownik
Skąd: Wrocław
Zarejestrowany: 2012-03-07

Re: [BASH] wiesz wyjścia polecnia lub pliku jako zmienna

Można użyć cut-a. A jak koniecznie awk-iem to polecam pierwsze kilka linków: https://www.google.com/search?q=awk+columns+range

Offline

 

#5  2013-06-20 00:39:50

  bonus - Użytkownik

bonus
Użytkownik
Zarejestrowany: 2009-11-12

Re: [BASH] wiesz wyjścia polecnia lub pliku jako zmienna

Jakoś nie mogę nic znaleźć może ktoś poda polecenie które wyświetli kolumny od $4 do końca bez względu na ich liczbę.

Offline

 

#6  2013-06-20 01:26:11

  megabajt - Użytkownik

megabajt
Użytkownik
Skąd: Wrocław
Zarejestrowany: 2012-03-07

Re: [BASH] wiesz wyjścia polecnia lub pliku jako zmienna

manual cut-a nie gryzie :)

Kod:

cut -d' ' -f4-

Offline

 

#7  2013-06-20 10:15:40

  bonus - Użytkownik

bonus
Użytkownik
Zarejestrowany: 2009-11-12

Re: [BASH] wiesz wyjścia polecnia lub pliku jako zmienna

Już się pogryzłem z man cat'em ale ... niestety nadal problem.

Kod:

 xe vm-list | grep name-label | cut -f4-
     name-label ( RW): Debian 6-1
     name-label ( RW): Debian 6-2
     name-label ( RW): Control domain on host: xenserver-1

Kod:

xe vm-list | grep name-label | cut -d" " -f4-
  name-label ( RW): Debian 6-1
  name-label ( RW): Debian 6-2
  name-label ( RW): Control domain on host: xenserver-1

nieco zmniejsza wcięcie z lewej strony i tyle :/

tutaj ciekawostka

Kod:

xe vm-list | grep name-label | cut -s -d" " -f4- | cut -d" " -f4- | cut -d" " -f4-
6-1
6-2
domain on host: xenserver-1

Offline

 

#8  2013-06-20 10:54:04

  megabajt - Użytkownik

megabajt
Użytkownik
Skąd: Wrocław
Zarejestrowany: 2012-03-07

Re: [BASH] wiesz wyjścia polecnia lub pliku jako zmienna

Trzeba sobie odpowiedzieć na pytanie, czy zawsze ilość kolumn jest taka sama, czy delimiterem kolumn jest spacja, czy tabulator itp. Może to podziała:

Kod:

awk -F ':' '{print $2}' | sed 's/^ //g'

awk ustawia tutaj jako delimiter dwukropek i bierze drugą kolumnę, czyli wszystko co po wdukropku
sed usuwa z tego pierwsza spacje

Offline

 

#9  2013-06-20 12:16:00

  bonus - Użytkownik

bonus
Użytkownik
Zarejestrowany: 2009-11-12

Re: [BASH] wiesz wyjścia polecnia lub pliku jako zmienna

Efekt porządany

Kod:

#!/bin/bash
IFS=$','
for MASZYNA in $(xe vm-list | grep name-label | awk -F ':' '{print $2}' | sed 's/^ //g'
| grep -v Control); do echo $MASZYNA; done
unset IFS

Kod:

./test.sh
Debian 6-1 test
Debian 6-2

ale xenserver by uwzględnić tą etykietę jako wartość parametru vm musi w wartości zmiennej otrzymać nieco inną postać tj:
Debian\ 6-2
Debian\ 6-1\ test
więc taką postać musi zwrócić powyższy skrypt po każdym wyrazie "\" za wyjątkiem ostatniego. Można by po każdym wyrazie dodać "\" i usunąć ostatni znak z końca wiersza, ale jak?

Ostatnio edytowany przez bonus (2013-06-20 12:19:15)

Offline

 

#10  2013-06-20 14:09:25

  megabajt - Użytkownik

megabajt
Użytkownik
Skąd: Wrocław
Zarejestrowany: 2012-03-07

Re: [BASH] wiesz wyjścia polecnia lub pliku jako zmienna

sed twoim przyjacielem:

Kod:

xe vm-list | grep name-label | grep -v Control  | awk -F ':' '{print $2}' | sed 's/^ //g' | sed 's/ /\\ /g'

Każdą spacje zamianiamy na spacje z backslashem


na przyszłość:
http://www.pement.org/awk/awk1line.txt
http://www.catonmat.net/blog/wp-content/uploads/2008/09/sed1line.txt

Ostatnio edytowany przez megabajt (2013-06-20 14:12:43)

Offline

 

#11  2013-06-20 15:00:37

  bonus - Użytkownik

bonus
Użytkownik
Zarejestrowany: 2009-11-12

Re: [BASH] wiesz wyjścia polecnia lub pliku jako zmienna

Kurde nie wiem jak to robi xenserver ale ...
z poziomu konsoli jak chcę wykonać polecenie np. xe vm-shutdown vm= podpowiadam sobie tab'em i

Kod:

xe vm-shutdown vm=
Control\ domain\ on\ host:\ xenserver-1
Debian\ 6-1\ test
Debian\ 6-2

więc niby oczekuje takiej formy, nawet jak mu z palca wpiszę jako parametr vm=Debian\ 6-2 to wykona polecenie, gdy chcę skorzystać ze skryptu

Kod:

#!/bin/bash
IFS=$','
for MASZYNA in $(xe vm-list | grep name-label \
| awk -F ':' '{print $2}' | sed 's/^ //g' \
| sed 's/ /\\ /g' \
| grep -v Control); \
do echo $MASZYNA & xe vm-shutdown vm=$MASZYNA; \
done
unset IFS

Kod:

./test.sh
Debian\ 6-1\ test
Debian\ 6-2
Error: No matching VMs found

na inne maszynie robię inny skrypt, gdzie jako parametr skryptu tj. $1 mam zdefiniowane nazwę po prostu "Debian 6-2" natomiast w skrypcie odwołuję się do parametru poprzez zmienną:
VM=$1
a w funkcji w tym skrypcie odwołuję się do tej zmiennej tak: xe vm-shutdown vm="${VM}" i wszystko działa, więc nie wiem w jaki sposób zapodać wartość vm w omawianym przykładzie by polecenie xe wykonało się.

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)