sed
w systemie AIX nie robi tego, co moim zdaniem powinno. Próbuję zastąpić wiele spacji jedną spacją w danych wyjściowych IOSTAT:
# iostat
System configuration: lcpu=4 drives=8 paths=2 vdisks=0
tty: tin tout avg-cpu: % user % sys % idle % iowait
0.2 31.8 9.7 4.9 82.9 2.5
Disks: % tm_act Kbps tps Kb_read Kb_wrtn
hdisk9 0.2 54.2 1.1 1073456960 436765896
hdisk7 0.2 54.1 1.1 1070600212 435678280
hdisk8 0.0 0.0 0.0 0 0
hdisk6 0.0 0.0 0.0 0 0
hdisk1 0.1 6.3 0.5 63344916 112429672
hdisk0 0.1 5.0 0.2 40967838 98574444
cd0 0.0 0.0 0.0 0 0
hdiskpower1 0.2 108.3 2.3 2144057172 872444176
# iostat | grep hdisk1
hdisk1 0.1 6.3 0.5 63345700 112431123
#iostat|grep "hdisk1"|sed -e"s/[ ]*/ /g"
h d i s k 1 0 . 1 6 . 3 0 . 5 6 3 3 4 5 8 8 0 1 1 2 4 3 2 3 5 4
sed powinien przeszukiwać i zamieniać wiele spacji (/ [] * /) pojedynczym spacją (/ /) dla całej grupy (/ g) ... ale nie tylko robi to ... odstępy między znakami.
Co ja robię źle? Wiem, że to musi być coś prostego ... AIX 5300-06
edycja: Mam inny komputer z ponad 10 dyskami twardymi. Używam tego jako parametru innego programu do celów monitorowania.
Problem, na który natrafiłem, polegał na tym, że „awk” {print 5 $} nie działał, ponieważ używam 1 $ itp. Na drugim etapie i dawałem błędy w poleceniu Drukuj. Szukałem wersji grep / sed / cut Wydaje się, że działa:
iostat | grep "hdisk1 " | sed -e's/ */ /g' | cut -d" " -f 5
[] Były „0 lub więcej”, kiedy myślałem, że oznaczają „tylko jeden”. Usunięcie wsporników działało. Trzy bardzo dobre odpowiedzi bardzo szybko utrudniają wybór „odpowiedzi”.
źródło
/[ ]*/
dopasowuje zero lub więcej spacji, więc pusty ciąg między znakami pasuje.Jeśli próbujesz dopasować „jedno lub więcej spacji”, użyj jednego z tych:
źródło
*
czyni go „opcjonalnym”.[ ]
tworzy po prostu listę znaków z tylko jednym znakiem (spacją). Jest to kwantyfikator,*
który oznacza „zero lub więcej z poprzedniej rzeczy”tr -s ' '
rozwiązanieZmień
*
operatora na+
. Dopasowujesz zero lub więcej poprzedniej postaci, która pasuje do każdej postaci, ponieważ wszystko, co nie jest spacją, jest ... hm ... zerowym wystąpieniem spacji. Musisz dopasować JEDEN lub więcej. W rzeczywistości lepiej byłoby dopasować dwa lub więcejKlasa znaków w nawiasach kwadratowych nie jest również konieczna do dopasowania jednego znaku. Możesz po prostu użyć:
... chyba że chcesz dopasować tabulatory lub inne rodzaje spacji, klasa postaci jest dobrym pomysłem.
źródło
s/ */ /g
(to z trzema spacjami, formatowanie komentarzy je zwija ). Operator gwiazdy sprawi, że poprzedni znak będzie opcjonalny, więc jeśli dopasujesz dwa lub więcej, musisz dopasować pierwsze dwa samodzielnie (dwa pola), a następnie dodaj trzecie pole i gwiazdkę, aby trzecie i następne pola były opcjonalne.Zawsze możesz dopasować ostatnie wystąpienie w sekwencji czegoś takiego jak:
I tak jesteś na dobrej drodze, ale zamiast zastępować sekwencję spacją - zastąp ją ostatnim wystąpieniem - pojedynczą spacją. W ten sposób, jeśli sekwencja spacji zostanie dopasowana, sekwencja zostanie zredukowana do pojedynczej spacji, ale jeśli dopasowany zostanie łańcuch zerowy, wówczas łańcuch zerowy zostanie zastąpiony samym sobą - bez szkody, bez faulu. Na przykład:
WYNIK
To powiedziawszy, prawdopodobnie lepiej jest całkowicie uniknąć wyrażeń regularnych w tej sytuacji i zamiast tego:
źródło
iostat | tr -s \
Zauważ, że możesz także robić to, co próbujesz
przez
co może być szczególnie przydatne, jeśli później spróbujesz uzyskać dostęp do innych pól i / lub coś obliczyć - na przykład:
źródło
while
.$[ .. ]
prawdopodobnie jest dostępne w najnowszych wersjach bash (być może także zsh).$(( .. ))
Zamiast tego zaktualizowałem odpowiedź na bardziej przenośną .Możesz użyć następującego skryptu, aby przekonwertować wiele spacji na pojedynczą spację, TAB lub dowolny inny ciąg:
compress_spaces.sh
źródło