Saya ingin mendapatkan kolom terakhir dari sampel ini:
[ 3] 1.0- 2.0 sec 1.00 MBytes 8.39 Mbits/sec
[ 3] 2.0- 3.0 sec 768 KBytes 6.29 Mbits/sec
[ 3] 3.0- 4.0 sec 512 KBytes 4.19 Mbits/sec
[ 3] 4.0- 5.0 sec 256 KBytes 2.10 Mbits/sec
...
Jika saya gunakan
cut -d\ -f 13
saya mendapat
Mbits/sec
6.29
4.19
2.10
karena terkadang ada ruang tambahan di antaranya.
text-processing
columns
cut
rubo77
sumber
sumber
Mbits/sec
, apakah itu yang Anda inginkan atau 2 kolom terakhir?Jawaban:
Untuk menjawab pertanyaan Anda secara harfiah:
atau
Tapi itu tidak akan berhasil jika angka dalam kurung mencapai 10, dll. Jika Anda hanya tertarik pada angka, Anda bisa menghapus yang lainnya.
sumber
| sed 's/ .*//'
pada akhir dua contoh pertama. Tentu saja ada banyak cara lain untuk melakukannya.+
bukannya*
: tes kucing | sed 's / [^. 0-9] \ + /: / g' | cut -d: -f 6+
dan?
dalam ERE tetapi tidak meninggalkan\+
dan\?
dalam BRE.Jika kita menggunakan
tr
perintah bersama dengan opsi pemerasan (-s
bendera) untuk mengonversi semua beberapa ruang berurutan menjadi satu ruang dan kemudian melakukancut
operasi dengan ruang sebagai pembatas - kita dapat mengakses kolom yang diperlukan yang memuat angka-angka.Lihat kode yang terpotong di bawah ini:
cat file | tr -s ' ' | cut -d ' ' -f 8
sumber
Semua perintah ini akan mencetak kolom terakhir dari file yang dipisahkan oleh spasi:
awk '{print $NF}' file
di
awk
,NF
adalah jumlah bidang dan bidang$NF
terakhir.perl -lane 'print $F[$#F]' file
-a
membagi file pada spasi putih ke dalam array@F
,$#F
adalah jumlah elemen dalam array sehingga$F[$#F]
merupakan elemen terakhir. Cara-n
membaca file yang diberikan pada baris perintah dan menerapkan skrip yang diteruskan-e
ke setiap baris.-l
cukup tambahkan karakter baris baru (\n
) ke setiapprint
pernyataan.sed 's/.* //g'
ekspresi reguler sederhana yang cocok dengan semuanya hingga ruang terakhir dan menghapusnya, hanya menyisakan kolom terakhir.
rev file | cut -d' ' -f 1 | rev
rev
membalikkan outputnya sehingga bidang terakhir adalah yang pertama,cut
dengan ruang pembatas untuk mencetaknya danrev
membalikkan teks kembali ke normal. Ini tidak akan berfungsi jika Anda memiliki spasi putih berturut-turut .Berdasarkan input Anda, saya kira Anda tidak benar-benar menginginkan kolom terakhir tetapi yang kedua dari belakang atau dua yang terakhir. Dalam hal ini gunakan ini untuk mencetak 2 terakhir (
8.39 Mbits/sec
):dan ini untuk mencetak kedua dari belakang (
8.39
):sumber
Anda tidak dapat memisahkan beberapa kejadian spasi putih menggunakan
cut
sesuai manual:kecuali teks dipisahkan dengan jumlah yang sama atau Anda gunakan
tr
untuk menghapus kelebihannya.Kalau tidak gunakan alat alternatif seperti
awk
,sed
atauex
.Sebagai contoh:
Ganti
+q!
dengan-cwq
untuk menyimpan perubahan di tempat.sumber
Gunakan perl one-liner seperti:
perl -lane 'print $F[-2]' input_file
Penjelasan:
Pilihan
-e
menyebabkan penerjemah perl mencari skrip inline, bukan dalam file.Pilihan
-n
menyebabkan input (file atau STDIN dari pipa) dibaca baris demi baris.Pilihan
-l
menghapus pemisah rekaman input (tergantung OS, baris baru pada UNIX secara default) setelah membaca baris, dan menambahkannya di akhir setiapprint
Opsi
-a
menyebabkan setiap baris input dipecah pada spasi menjadi array@F
, dan$F[-2]
merupakan elemen kedua yang dihitung dari ujung, yang merupakan bidang yang Anda inginkan. Anda juga dapat menggunakan$F[$#F-1]
, di mana$#F
indeks terakhir array@F
, yang sedikit kurang dapat dibaca.sumber