Sebagai bagian dari skrip ini, saya harus dapat memeriksa apakah argumen pertama yang diberikan cocok dengan kata pertama dari file. Jika ya, keluar dengan pesan kesalahan; jika tidak, tambahkan argumen ke file. Saya mengerti bagaimana menulis if
pernyataan, tetapi tidak bagaimana menggunakannya grep
dalam skrip. Saya mengerti bahwa grep
akan terlihat seperti ini
grep ^$1 schemas.txt
Saya merasa ini seharusnya lebih mudah daripada saya membuatnya.
Saya mendapat kesalahan "terlalu banyak argumen" pada if
pernyataan itu. Saya menyingkirkan ruang antara grep -q
dan kemudian mendapat kesalahan yang diharapkan operator biner.
if [ grep -q ^$1 schemas.txt ]
then
echo "Schema already exists. Please try again"
exit 1
else
echo "$@" >> schemas.txt
fi
[
...]
dan itu akan berhasil. Meskipun Anda mungkin ingin mengutip pola Anda:if grep -q "^$1" schemas.txt; then …
Jawaban:
grep
mengembalikan kode keluar yang berbeda jika ia menemukan sesuatu (nol) vs. jika belum menemukan apa pun (bukan nol). Dalam sebuahif
pernyataan, kode keluar nol dipetakan ke "true" dan kode keluar bukan nol dipetakan ke false. Selain itu, grep memiliki-q
argumen untuk tidak menampilkan teks yang cocok (tetapi hanya mengembalikan kode status keluar)Jadi, Anda bisa menggunakan grep seperti ini:
Sebagai catatan singkat, ketika Anda melakukan sesuatu seperti
if [ -z "$var" ]…
, ternyata itu[
sebenarnya adalah perintah yang Anda jalankan, seperti halnya grep. Di sistem saya, itu/usr/bin/[
. (Yah, secara teknis, shell Anda mungkin sudah built-in, tapi itu optimasi. Berperilaku seolah-olah itu adalah perintah). Ini bekerja dengan cara yang sama,[
mengembalikan kode keluar nol untuk true, kode keluar non-nol untuk false. (test
sama dengan[
, kecuali untuk penutupan]
)sumber
ls -l /usr/bin/\[
danman [
lihat itu[
adalah program seperti yang lain, itu hanya terlihat seperti elemen sintaksis - ini harus membuatnya jelas dan lebih mudah dimengerti. (untuk kenyamanan,[
ini juga merupakan built-in di bash, dash, dan lain-lain - tetapi masih perintah). coba jugatype -all [
di bash.-q
, opsi itu memberi tahu grep untuk diam (tidak mencetak garis yang cocok).Cara sederhana lainnya adalah menggunakan
grep -c
.Output itu (tidak kembali sebagai kode keluar), jumlah baris yang cocok dengan pola, jadi 0 jika tidak ada kecocokan atau 1 atau lebih jika ada kecocokan.
Jadi, jika Anda ingin memeriksa bahwa polanya cocok 3 kali atau lebih, Anda akan melakukannya:
sumber
grep -cim1
sebagai gantinya.Saya tahu saya terlambat untuk ini, tapi saya suka versi pendek ini:
sumber
Jika kita ingin menangkap kata pertama dari suatu file, kita perlu menambahkan
-zw
grepTanpa
-z
kita mendapatkan kata pertama dari sebuah baris. Tanpa-w
kita mendapat kata-kata parsial.sumber
Jika Anda ingin menggunakannya dengan tanda kurung siku, Anda dapat mengeksekusi di bawah ini
Logika ini berfungsi untuk semua perintah, Cukup tempatkan perintah Anda di dalam backtick (tombol di atas tab atau di bawah tombol Esc atau di sebelah kiri tombol 1)
sumber
`grep -q PATTERN file.txt`
, jika tidak operator split + glob diterapkan dan itu akan menyebabkan masalah untuk output apa pun yang berisi karakter$IFS
atau karakter wildcard. Lebih umum,[ "`cmd`" ]
akan mengembalikan true jikacmd
output setidaknya satu baris non-kosong di stdout (dengan potensi masalah jika output NUL byte). Itu berarti shell harus menyimpan seluruh output dalam memori dan menunggu sampai selesai.if cmd | grep -q .
Sebaliknya menggunakan mungkin lebih disukai dalam hal itu.-q
saklar adalah untuk menekangrep
output. Anda mengatakan: Periksa POLA di file.txt, tekan output apa pun, lalu atur status pengembalian sesuai dengan apakah POLA ditemukan. Kemudian, abaikan status pengembalian, ambil output perintah (yang kami terpaksa kosong), terapkan pemisahan kata dan ajukan ekspansi glob (tidak menghasilkan argumen sama sekali), lalu jalankan perintah[
(aliastest
) dengan tepat satu argumen - yaitu ,]
--dan kemudian, karena itu akan menghasilkan kesalahan, gema "tidak ditemukan". @ StéphaneChazelas, apakah saya melewatkan sesuatu?-q
. Komentar itu masuk akal[ `grep PATTERN file.txt ` ]
, tetapi seperti yang ditunjukkan dalam komentar,[ "`grep -n PATTERN file.txt`" ]
akan lebih baik jika POLA hanya cocok dengan baris kosong. Meskipun di sini tentu saja itu yangif grep -q PATTERN file.txt
Anda inginkan.