sed
на AIX не делает то, что я думаю, что должно. Я пытаюсь заменить несколько пробелов одним пробелом в выводе 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 должен искать и заменять (-ять) несколько пробелов (/ [] * /) одним пробелом (/ /) для всей группы (/ g) ... но он не только делает это ... он разделяет каждый символ.
Что я делаю неправильно? Я знаю, это должно быть что-то простое ... AIX 5300-06
редактировать: у меня есть другой компьютер, который имеет более 10 жестких дисков. Я использую это как параметр для другой программы для целей мониторинга.
Проблема, с которой я столкнулся, заключалась в том, что «awk» {print $ 5} 'не работал, потому что я использую $ 1 и т. Д. На втором этапе и выдавал ошибки командой Print. Я искал версию grep / sed / cut Кажется, что работает:
iostat | grep "hdisk1 " | sed -e's/ */ /g' | cut -d" " -f 5
[] Были "0 или больше", когда я думал, что они означают "только один". Сняв скобки, все заработало. Три очень хороших ответа очень быстро затрудняют выбор «ответа».
источник
/[ ]*/
соответствует нулю или более пробелов, поэтому пустая строка между символами совпадает.Если вы пытаетесь сопоставить «один или несколько пробелов», используйте один из них:
источник
*
делает его «необязательным».[ ]
просто составляет список символов только с одним символом (пробел). Это квантификатор,*
который означает «ноль или более от предыдущей вещи»tr -s ' '
решениеИзмените вашего
*
оператора на+
. Вы соответствуете нулю или нескольким предыдущим символам, что соответствует каждому символу, потому что все, что не является пробелом, это ... ну ... нулевые экземпляры пробела. Вы должны соответствовать ОДИН или больше. На самом деле было бы лучше сопоставить два или болееКласс символов в квадратных скобках также не требуется для сопоставления одного символа. Вы можете просто использовать:
... если вы не хотите сопоставлять табуляцию или другие виды пробелов, то класс символов будет хорошей идеей.
источник
s/ */ /g
(это с тремя пробелами, форматирование комментариев сворачивает их). Оператор звездочки сделает предыдущий символ необязательным, поэтому, если вы хотите сопоставить его с двумя или более символами, вам нужно сопоставить первые два самостоятельно (два пробела), затем добавить третий пробел и звезду, чтобы сделать третий и последующие пробелы необязательными.Вы всегда можете сопоставить последнее вхождение в последовательности, например:
И поэтому вы на правильном пути, а не заменяете последовательность пробелом - замените его последним вхождением - одним пробелом. Таким образом , если последовательность пространств будет соответствовать , то последовательность не сводится к одному пространству, но если нулевая строка совпадает , то пустая строка заменяется сама по себе - и никакого вреда, нет фола. Так, например:
ВЫХОД
С учетом всего вышесказанного, вероятно, в этой ситуации гораздо лучше избегать регулярных выражений и делать вместо этого:
источник
iostat | tr -s \
Обратите внимание, что вы также можете делать то, что вы пытаетесь, то есть
по
что может быть особенно полезно, если вы позже попытаетесь получить доступ и к другим полям и / или рассчитать что-то вроде этого:
источник
while
.$[ .. ]
возможно в последних версиях bash (возможно, и в zsh). Я обновил ответ на более портативный$(( .. ))
вместо этого.Вы можете использовать следующий скрипт для преобразования нескольких пробелов в один пробел, TAB или любую другую строку:
compress_spaces.sh
источник