Katakanlah saya menjalankan perintah SayStuff
$ SayStuff
dan hasilnya
Watermelons and cucumbers
Sekarang. Katakanlah saya ingin mengekstraksi substring cucumbers
dari output dan menyalurkannya ke sesuatu.
Cara saya akan melakukan ini secara terprogram adalah dengan membagi output menjadi array oleh Space pembatas dan referensi oleh ArrayName[2]
. Saya cukup baru di shell script dan hanya berhasil menggali cut
contoh semi-cryptic , tidak ada yang masuk akal.
Ada ide?
linux
command-line
bash
krystah
sumber
sumber
cut
tidak akan menangani jumlah spasi variabel, saatawk
dilakukan.Saya mungkin akan menggunakan salah satu opsi yang sudah diberikan oleh @slhck tapi di sini ada beberapa cara untuk melakukan ini:
Menggunakan array, seperti yang Anda lakukan dalam bahasa lain:
The
var=()
menyatakan sebuah array,$(command)
menyimpan output dari perintah. Jadi,foo=( $(SayStuff) )
simpan outputSayStuff
ke dalam arrayfoo
dan kamu kemudianecho
elemen ketiga${foo[2]}
.sed
The
sed
perintah akan menggantikan (s///
) segala sesuatu dengan kata terakhir. Regex mencocokkan apa pun hingga spasi (.*
) yang akan mencocokkan semuanya hingga spasi terakhir dan kemudian menangkap kata terakhir(\(.*\)
. Karena kata telah ditangkap, kita dapat menyebutnya sebagai\1
.Versi yang lebih sederhana:
pesta
Ini menggunakan kemampuan manipulasi string bash, lihat di sini untuk detail lebih lanjut.
Lebih banyak bash
Perl, di mana tentu saja, ada banyak cara untuk melakukan ini:
The
-a
merekperl
berperilaku sepertiawk
, garis membelah di spasi dan menyimpan ke dalam array@F
. Kami kemudian mencetak elemen terakhir@F
($#F
adalah jumlah elemen dalam@F
). The-l
memberitahu perl untuk menambahkan baris baru untuk setiapprint
pernyataan,-n
bahwa ia harus memproses STDIN baris demi baris dan-e
bahwa ia harus menjalankan skrip yang diberikan pada baris perintah.Opsi dijelaskan di atas, kami hanya menghapus semuanya sampai ruang terakhir dan pencetakan (
-p
).Di sini kita meneruskan
Watermelons and cucumbers
sebagai argumen, perl yang akan disimpan dalam@ARG
array dan jadi, kita mencetak elemen terakhir@ARG
.tipu daya. Ini digunakan
sed
untuk mengkonversi spasi menjadi baris baru dan kemudiantail
hanya mencetak baris terakhir.grep dan ekspresi reguler, menggunakan
-o
yang hanya mencetak string yang cocok.curang
sumber
Berikut ini beberapa penjelasan:
Jadi jika Anda membutuhkan bidang ke-3 dan dibatasi oleh spasi '' maka itu
Jika Anda ingin bidang TERAKHIR Anda mungkin harus menggunakan awk .
Dalam hal ini menjadi:
Dalam
awk
NF adalah jumlah bidang dalam baris sehingga$NF
berarti bidang terakhir dalam baris.sumber