Saya punya string
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256
dan ingin mengekstrak kata qa
yang mengikuti -Dspring.profiles.active
.
Saya memiliki string simpan dalam file text.txt hanya untuk menunjukkannya.
Kapan saya melakukannya
grep -r -o "spring.profiles.active=" text.txt
Hasilnya adalah spring.profiles.active=
Kata ini tidak selalu qa
, bisa prod
atau dev
.
Apa yang saya ingin lakukan adalah menemukan kata spring.profiles.active
dan setelah itu =
ekstrak kata.
Saya ingin membuat shell script ini karena saya menggunakan kata untuk mengkonfigurasi item lain di server.
Apakah ini mungkin dan jika demikian, bagaimana saya melakukannya.
Jawaban:
Anda dapat menggunakan
grep
dengan PCRE (-P
):spring.profiles.active=
akan cocok dengan substring ini secara harfiah,\K
akan membuang pertandingan[^ ]+
akan memilih bagian yang diinginkan yaitu bagian setelahspring.profiles.active=
, hingga ruang berikutnyaUntuk file:
Contoh:
sed
akan mengambil logika serupa:Contoh:
Menangani kesalahan:
Dalam skrip Anda, Anda mungkin ingin menangani case di mana tidak ada kecocokan, dengan kata lain di mana string asli Anda tidak mengandung
spring.profiles.active=
. Dalamsed
contoh di atas , Anda mendapatkan seluruh string asli, yang dapat menimbulkan masalah:Jika Anda lebih suka mendapatkan string kosong ketika tidak ada kecocokan, tambahkan
-n
opsi kesed
perintah danp
opsi kesed
s
perintah, seperti ini:Kemudian Anda dapat menguji apakah $ var kosong atau tidak.
sumber
var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"
gantifile.txt
dengan<<<'...string...'
jika input adalah string, bukan file..kemudian Anda dapat melakukannyaif [ "$var" = 'qa' ]; then do something; else do something; fi
Menggunakan
awk
atau
Contoh
sumber
Saya akan melemparkan satu Perl dalam campuran:
-l
: mengaktifkan pemrosesan akhir baris otomatis. Ini memiliki dua efek terpisah. Pertama, secara otomatis chomps $ / (pemisah rekaman input) saat digunakan dengan -n atau -p. Kedua, ia menetapkan $ \ (pemisah catatan output) untuk memiliki nilai octnum sehingga setiap pernyataan cetak akan memiliki pemisah yang ditambahkan kembali. Jika octnum dihilangkan, tetapkan $ \ ke nilai saat ini $ /.-a
: mengaktifkan mode autosplit saat digunakan dengan -n atau -p. Perintah split implisit ke array @F dilakukan sebagai hal pertama di dalam loop implisit saat diproduksi oleh -n atau -p.n
: menyebabkan Perl untuk mengasumsikan loop berikut di sekitar program Anda, yang membuatnya iterate atas argumen nama file agak seperti sed -n atau awk:-e
: dapat digunakan untuk memasukkan satu baris program.sumber
perl -nle '/spring.profiles.active=\K([^ ]+)/ && print $1' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'