sed
no AIX não está fazendo o que eu acho que deveria. Estou tentando substituir vários espaços por um único espaço na saída do 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
O sed deve procurar e substituir vários espaços (/ [] * /) por um único espaço (/ /) para todo o grupo (/ g) ... mas não é apenas isso: espaçar cada caractere.
O que estou fazendo errado? Eu sei que tem que ser algo simples ... AIX 5300-06
editar: eu tenho outro computador com mais de 10 discos rígidos. Estou usando isso como um parâmetro para outro programa para fins de monitoramento.
O problema que encontrei foi que "awk '{print $ 5}' não funcionou porque estou usando $ 1 etc. no estágio secundário e deu erros com o comando Print. Estava procurando uma versão grep / sed / cut O que parece funcionar é:
iostat | grep "hdisk1 " | sed -e's/ */ /g' | cut -d" " -f 5
Os [] eram "0 ou mais" quando pensei que eles queriam dizer "apenas um". A remoção dos suportes deu certo. Três respostas muito boas tornam muito difícil escolher a "resposta".
fonte
/[ ]*/
corresponde a zero ou mais espaços; portanto, a string vazia entre os caracteres corresponde.Se você estiver tentando combinar "um ou mais espaços", use um destes:
fonte
*
torna "opcional".[ ]
apenas faz uma lista de caracteres com apenas um caractere (um espaço). É o quantificador*
que significa "zero ou mais da expressão anterior"tr -s ' '
soluçãoMude o seu
*
operador para a+
. Você está correspondendo a zero ou mais caracteres anteriores, o que corresponde a todos os caracteres, porque tudo o que não é um espaço é ... um ... zero instâncias de espaço. Você precisa corresponder a UM ou mais. Na verdade, seria melhor combinar dois ou maisA classe de caracteres entre colchetes também não é necessária para combinar um caractere. Você pode apenas usar:
... a menos que você queira combinar tabulações ou outros tipos de espaços também, a classe de caracteres é uma boa ideia.
fonte
s/ */ /g
(ou seja, com três espaços, a formatação do comentário os está recolhendo). O operador estrela fará com que o caractere anterior seja opcional; portanto, se você combinar dois ou mais com ele, precisará corresponder os dois primeiros (dois espaços) e adicione um terceiro espaço e uma estrela para tornar opcionais os terceiros e seguintes espaços.Você sempre pode corresponder à última ocorrência em uma sequência de algo como:
E assim você está no caminho certo, mas em vez de substituir a sequência por um espaço - substitua-a pela sua última ocorrência - um único espaço. Dessa forma, se uma sequência de espaços for correspondida, a sequência será reduzida para um único espaço, mas se a sequência nula for correspondida, a sequência nula será substituída por ela mesma - e sem dano, sem falta. Então, por exemplo:
RESULTADO
Tudo isso dito, provavelmente é muito melhor evitar os regexps completamente nessa situação e, em vez disso:
fonte
iostat | tr -s \
Observe que você também pode fazer o que tenta, ou seja
por
o que pode ser especialmente útil se você tentar acessar posteriormente outros campos também e / ou calcular algo como:
fonte
while
.$[ .. ]
provavelmente está disponível nas versões recentes do bash (talvez zsh também). Atualizei a resposta para uma mais portátil$(( .. ))
.Você pode usar o script a seguir para converter vários espaços em um único espaço, uma TAB ou qualquer outra cadeia de caracteres:
compress_spaces.sh
fonte