sed
pada AIX tidak melakukan apa yang saya pikir seharusnya. Saya mencoba mengganti beberapa spasi dengan satu spasi dalam output 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 harus mencari & mengganti beberapa spasi (/ [] * /) dengan satu spasi (/ /) untuk seluruh grup (/ g) ... tetapi tidak hanya melakukan itu ... mengatur jarak setiap karakter.
Apa yang saya lakukan salah? Saya tahu ini pasti sesuatu yang sederhana ... AIX 5300-06
sunting: Saya memiliki komputer lain yang memiliki 10+ hard drive. Saya menggunakan ini sebagai parameter ke program lain untuk tujuan pemantauan.
Masalah yang saya temui adalah "awk '{print $ 5}' tidak berfungsi karena saya menggunakan $ 1, dll pada tahap sekunder dan memberikan kesalahan dengan perintah Print. Saya mencari versi grep / sed / cut Apa yang tampaknya berhasil adalah:
iostat | grep "hdisk1 " | sed -e's/ */ /g' | cut -d" " -f 5
[] Adalah "0 atau lebih" ketika saya pikir artinya "hanya satu". Menghapus braket membuatnya berfungsi. Tiga jawaban yang sangat bagus sangat cepat membuat sulit untuk memilih "jawaban".
sumber
/[ ]*/
cocok dengan nol atau lebih banyak ruang, sehingga string kosong antara karakter cocok.Jika Anda mencoba mencocokkan "satu atau lebih spasi", gunakan salah satu dari ini:
sumber
*
membuatnya "opsional".[ ]
hanya membuat daftar karakter dengan hanya satu karakter di dalamnya (spasi). Ini adalah penjumlahan*
yang berarti "nol atau lebih dari yang sebelumnya"tr -s ' '
solusi paling sederhanaUbah
*
operator Anda menjadi a+
. Anda mencocokkan nol atau lebih dari karakter sebelumnya, yang cocok dengan setiap karakter karena semua yang bukan spasi adalah ... um ... nol contoh spasi. Anda harus mencocokkan SATU atau lebih. Sebenarnya akan lebih baik untuk mencocokkan dua atau lebihKelas karakter yang dikurung juga tidak perlu untuk mencocokkan satu karakter. Anda bisa menggunakan:
... kecuali jika Anda ingin mencocokkan tab atau jenis ruang lainnya juga, maka kelas karakter adalah ide yang bagus.
sumber
s/ */ /g
(itu dengan tiga spasi, format komentar runtuh). Operator bintang akan membuat karakter sebelumnya opsional, jadi jika Anda mencocokkan dua atau lebih dengan itu Anda harus mencocokkan dua sendiri pertama (dua spasi) kemudian tambahkan spasi ketiga dan bintang untuk membuat spasi ketiga dan selanjutnya opsional.Anda selalu dapat mencocokkan kejadian terakhir dalam urutan yang seperti:
Jadi Anda berada di jalur yang benar, tetapi alih-alih mengganti urutan dengan spasi - ganti dengan kejadian terakhir - satu ruang. Dengan cara itu jika urutan ruang yang cocok maka urutan dikurangi menjadi satu ruang, tetapi jika string nol cocok maka null string diganti dengan dirinya sendiri - dan tidak membahayakan, tidak busuk. Jadi, misalnya:
KELUARAN
Semua yang dikatakan, mungkin jauh lebih baik untuk menghindari regexps sepenuhnya dalam situasi ini dan lakukan sebagai gantinya:
sumber
iostat | tr -s \
Perhatikan bahwa Anda juga dapat melakukan apa yang Anda usahakan, yaitu
oleh
yang mungkin sangat berguna jika nanti Anda mencoba mengakses bidang lain juga dan / atau menghitung sesuatu - seperti ini:
sumber
while
.$[ .. ]
mungkin tersedia di versi bash terbaru (mungkin zsh juga). Saya memperbarui jawaban ke yang lebih portabel$(( .. ))
.Anda dapat menggunakan skrip berikut untuk mengonversi beberapa spasi menjadi satu spasi, TAB atau string lain:
compress_spaces.sh
sumber