Mam plik, który zawiera szczegółowe informacje na temat maszyn wirtualnych działających w hiperwizorze. Wykonujemy polecenie i przekierowujemy dane wyjściowe do pliku. A dane są dostępne w poniższym formacie.
Virtual Machine : OL6U5
ID : 0004fb00000600003da8ce6948c441bb
Status : Running
Memory : 65536
Uptime : 17835 Minutes
Server : MyOVS1.vmorld.com
Pool : HA-POOL
HA Mode: false
VCPU : 16
Type : Xen PVM
OS : Oracle Linux 6
Virtual Machine : OL6U6
ID : 0004fb00000600003da8ce6948c441bc
Status : Running
Memory : 65536
Uptime : 17565 Minutes
Server : MyOVS2.vmorld.com
Pool : NON-HA-POOL
HA Mode: false
VCPU : 16
Type : Xen PVM
OS : Oracle Linux 6
Virtual Machine : OL6U7
ID : 0004fb00000600003da8ce6948c441bd
Status : Running
Memory : 65536
Uptime : 17835 Minutes
Server : MyOVS1.vmorld.com
Pool : HA-POOL
HA Mode: false
VCPU : 16
Type : Xen PVM
OS : Oracle Linux 6
Ta informacja wyjściowa różni się od hiperwizora do hiperwizora, ponieważ na niektórych hiperwizorach mamy uruchomionych ponad 50 vms. Powyższy plik jest tylko przykładem hiperwizora, w którym mamy tylko 3 maszyny wirtualne, a zatem przekierowany plik powinien zawierać informacje o kilku (liczba N maszyn wirtualnych)
Musimy uzyskać te szczegóły w poniższym formacie za pomocą awk / sed lub skryptu powłoki
Virtual_Machine ID Status Memory Uptime Server Pool HA VCPU Type OS
OL6U5 0004fb00000600003da8ce6948c441bb Running 65536 17835 MyOVS1.vmworld.com HA-POOL false 16 Xen PVM Oracle Linux 6
OL6U6 0004fb00000600003da8ce6948c441bc Running 65536 17565 MyOVS2.vmworld.com NON-HA-POOL false 16 Xen PVM Oracle Linux 6
OL6U5 0004fb00000600003da8ce6948c441bd Running 65536 17835 MyOVS1.vmworld.com HA-POOL false 16 Xen PVM Oracle Linux 6
text-processing
sed
awk
IgniteLX
źródło
źródło
Odpowiedzi:
Jeśli dwukrotne przejście pliku nie stanowi (dużego) problemu (zapisze tylko jedną linię w pamięci):
Który dla ogólnej liczby pól byłby (który może mieć wiele spacerów po pliku):
Ale w przypadku naprawdę ogólnej transpozycji będzie to działać:
I aby było ładnie (używając tab
\t
jako separatora pól out):Powyższy kod ogólnej transpozycji zapisze całą macierz w pamięci.
Może to stanowić problem w przypadku naprawdę dużych plików.
Zaktualizuj nowy tekst.
Aby przetworzyć nowy tekst zamieszczony w pytaniu, Wydaje mi się, że najlepszą odpowiedzią są dwa przejścia awk. Jedno przejście, o ile istnieją pola, spowoduje wydrukowanie tytułów pól nagłówka. Następne przejście do awk wyświetli tylko pole 2. W obu przypadkach dodałem sposób usuwania spacji początkowych i końcowych (dla lepszego formatowania).
Otoczenie
{ ... } | column -t -s "$(printf '%b' '\t')"
ma sformatować cały stół w ładny sposób.Pamiętaj, że
"$(printf '%b' '\t')"
można je zastąpić$'\t'
w ksh, bash lub zsh.źródło
Jeśli masz dostępne
rs
narzędzie (przekształć) , możesz wykonać następujące czynności:Daje to format wyjściowy dokładnie taki, jak określono w pytaniu, nawet do dynamicznych szerokości kolumn.
-T
Transponuje dane wejściowe-z
dopasowuje kolumny odpowiednio do maksimum w każdej kolumnie-c:
używa dwukropka jako separatora pola wejściowegoDziała to w przypadku tabel o dowolnym rozmiarze, np .:
rs
jest domyślnie dostępny na OS X (i prawdopodobnie na innych maszynach BSD). Może być zainstalowany na Ubuntu (i rodzinie Debiana) z:źródło
EDYCJA: Rozszerzalna na dowolną liczbę wierszy wyjściowych, w prostej
for
pętli jednowierszowej :Oryginalna odpowiedź:
Możesz to zrobić jako jedno-liniowy przy użyciu
bash
podstawienia procesu:-s
Opcjapaste
pozwala obsłużyć każdy plik na raz.:
Zestaw separatorapaste
jest „złapany” przez-s
opcjącolumn
na końcu, aby całkiem się formatem poprzez pola kolejce.Te
cut
polecenia w dwa podstawniki procesu wyciągnąć pierwsze pole oraz drugie pole, odpowiednio.To, czy na wejściu są puste linie, czy nie, nie ma znaczenia, niezależnie od tego,
column -t -s:
czy wyczyści dane wyjściowe. (W pierwotnym wejściu określonym w pytaniu były puste linie, ale zostały one usunięte. Powyższe polecenie działa niezależnie od pustych linii.)Wejście - zawartość pliku o nazwie „wejście” w powyższym poleceniu:
Wynik:
źródło
Korzystając z awk, zachowaj klucz i wartość i wydrukuj je na końcu.
Po prostu bieg
awk -f ./script.awk ./input.txt
źródło
źródło
Z
gnu datamash
icolumn
odutil-linux
:Działa to z więcej niż dwiema kolumnami, ale zakłada, że w pliku wejściowym nie ma pustych linii; z pustymi wierszami pomiędzy (jak w początkowej próbce wejściowej), otrzymasz błąd taki jak:
aby uniknąć konieczności wyciśnięcia ich przed przetwarzaniem za pomocą
datamash
:W przeciwnym razie, w tym konkretnym przypadku (tylko dwie kolumny), z
zsh
tym samymcolumn
:(${(f)"$(<infile)"})
czyta linie w tablicy;${(j;:;)list[@]%:*}
łączy (z:
) pierwszym polem każdego elementu i${(j;:;)list[@]#*:}
łączy (ponownie z:
) drugim polem każdego elementu; oba są drukowane, np. wyjście jestktóry jest następnie przesyłany do
column -t -s:
źródło
cat <(head -n 11 virtual.txt | cut -d: -f1) <(sed 's/.*: //' virtual.txt) | xargs -d '\n' -n 11 | column -t
W tym przypadku liczba wierszy na maszynę wirtualną jest zakodowana na stałe - 11. Lepiej policz ją wcześniej i zapisz w zmiennej, a następnie użyj tej zmiennej w kodzie.
Wyjaśnienie
cat <(command 1) <(command 2)
-<()
konstrukcja sprawia, żecommand
dane wyjściowe wyglądają jak plik tymczasowy. Dlategocat
konkatenuje dwa pliki i potokuje je dalej.head -n 11 virtual.txt | cut -d: -f1
daje nam przyszłe nagłówki kolumn. Jedna pozycja maszyny wirtualnej to pierwsze jedenaście linii,head
do jej uzyskania służy polecenie.cut
Dzieli ten wpis do dwóch kolumnach i wydrukować tylko pierwszy z nich.sed 's/.*: //' virtual.txt
- podaje nam przyszłe wartości kolumn.sed
usuwa cały niepotrzebny tekst i pozostawia tylko wartości.xargs -d '\n' -n 11
. Każdy element wejściowy jest zakończony znakiem nowej linii. To polecenie pobiera elementy i drukuje je o 11 w wierszu.column -t
- jest potrzebny do ładnych wydruków. Wyświetla nasze linie w formie tabeli. W przeciwnym razie każda linia będzie miała inną szerokość.Wynik
źródło
Użyj
datamash
i jegotranspose
opcji, aby zamienić wiersze i kolumny w pliku.Domyślnie transpozycja sprawdza, czy dane wejściowe mają taką samą liczbę pól w każdym wierszu, w przeciwnym razie kończy się błędem i można wyłączyć tryb ścisły, aby zezwolić na brakujące wartości
--no-strict
Możesz także użyć
--filler
do ustawienia wartości pola brakującego pola:pochodzi z
datamash manual
źródło
jeśli twoje dane znajdują się w osobnych plikach w katalogu, możesz użyć:
może być konieczne masowanie liczby
\t
(tab) znaków wprintf
wierszu, jeśli wartości zmiennych mają różne długości.źródło