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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Na Xenserver Citrix poleceniem
xe vm-list | grep name | awk '{print $4,$5;}' | grep -v ^Control
wynik
Debian 6-1 Debian 6-2
Chciałem wykonać pętle na każdej z maszyn oznaczonej powyższą etykietą
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:
Debian 6-1 Debian 6-2
jak zrobić by zmienna przyjęła wartość jako zawartość wiersza wyjścia polecenia?
Offline
IFS=$'\n'; for MASZYNA in $(xe vm-list | grep name | awk '{print $4,$5;}' | grep -v ^Control); do echo $MASZYNA; done
albo bardziej elegancko:
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
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
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
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
manual cut-a nie gryzie :)
cut -d' ' -f4-
Offline
Już się pogryzłem z man cat'em ale ... niestety nadal problem.
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
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
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
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:
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
Efekt porządany
#!/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
./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
sed twoim przyjacielem:
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
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
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
#!/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
./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
Strony: 1