sed
en AIX no está haciendo lo que creo que debería. Estoy tratando de reemplazar múltiples espacios con un solo espacio en la salida de 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 debería buscar y reemplazar (s) múltiples espacios (/ [] * /) con un solo espacio (/ /) para todo el grupo (/ g) ... pero no solo está haciendo eso ... está espaciando cada carácter.
¿Qué estoy haciendo mal? Sé que tiene que ser algo simple ... AIX 5300-06
editar: Tengo otra computadora que tiene más de 10 discos duros. Estoy usando esto como parámetro para otro programa con fines de monitoreo.
El problema con el que me encontré fue que "awk '{print $ 5}' no funcionó porque estoy usando $ 1, etc. en la etapa secundaria y di errores con el comando Imprimir. Estaba buscando una versión grep / sed / cut Lo que parece funcionar es:
iostat | grep "hdisk1 " | sed -e's/ */ /g' | cut -d" " -f 5
Los [] s fueron "0 o más" cuando pensé que significaban "solo uno". Quitar los soportes lo hizo funcionar. Tres respuestas muy buenas realmente hacen que sea difícil elegir la "respuesta".
fuente
/[ ]*/
coincide con cero o más espacios, por lo que la cadena vacía entre caracteres coincide.Si está intentando hacer coincidir "uno o más espacios", use uno de estos:
fuente
*
hace "opcional".[ ]
solo hace una lista de caracteres con un solo personaje (un espacio). Es el cuantificador*
que significa "cero o más de lo anterior"tr -s ' '
solución más simpleCambie su
*
operador a a+
. Estás haciendo coincidir cero o más del carácter anterior, que coincide con cada carácter porque todo lo que no es un espacio es ... um ... cero instancias de espacio. Necesitas hacer coincidir UNO o más. En realidad, sería mejor combinar dos o másLa clase de caracteres entre corchetes tampoco es necesaria para hacer coincidir un carácter. Solo puedes usar:
... a menos que quiera hacer coincidir las pestañas u otros tipos de espacios también, entonces la clase de caracteres es una buena idea.
fuente
s/ */ /g
(con tres espacios, el formato del comentario los está colapsando). El operador de estrella hará que el carácter anterior sea opcional, por lo que si desea hacer coincidir dos o más con él, debe unir los dos primeros usted mismo (dos espacios) y luego agregar un tercer espacio y una estrella para hacer que el tercero y los siguientes espacios sean opcionales.Siempre puede coincidir con la última aparición en una secuencia de algo como:
Y entonces estás en el camino correcto, pero en lugar de reemplazar la secuencia con un espacio, reemplázalo con su última aparición, un solo espacio. De esta forma si una secuencia de espacios se igualó a continuación, la secuencia se reduce a un solo espacio, pero si la cadena nula se compara entonces la cadena nula se reemplaza por sí mismo - y no hay daño, no hay falta. Así por ejemplo:
SALIDA
Dicho todo esto, probablemente sea mucho mejor evitar las expresiones regulares por completo en esta situación y hacer lo siguiente:
fuente
iostat | tr -s \
Tenga en cuenta que también puede hacer lo que intenta, es decir
por
lo cual podría ser especialmente útil si luego intentas acceder a otros campos y / o calcular algo, como este:
fuente
while
.$[ .. ]
probablemente esté disponible en versiones recientes de bash (quizás también zsh). Actualicé la respuesta a una más portátil en su$(( .. ))
lugar.Puede usar el siguiente script para convertir múltiples espacios en un solo espacio, una TAB o cualquier otra cadena:
compress_spaces.sh
fuente