Saya melihat one-liner ini baru-baru ini:
$ ps -ef | grep [f]irefox
thorsen 16730 1 1 Jun19 ? 00:27:27 /usr/lib/firefox/firefox ...
Jadi sepertinya mengembalikan daftar proses dengan "firefox" dalam data tetapi meninggalkan proses grep itu sendiri, dan karena itu tampaknya setara dengan:
ps -ef |grep -v grep| grep firefox
Saya tidak mengerti bagaimana cara kerjanya. Saya telah melihat halaman manual grep dan di tempat lain tetapi belum menemukan penjelasan.
Dan untuk menambah misteri jika saya lari:
$ ps -ef | grep firefox > data
$ grep [f]irefox data
thorsen 15820 28618 0 07:28 pts/1 00:00:00 grep --color=auto firefox
thorsen 16730 1 1 Jun19 ? 00:27:45 /usr/lib/firefox/firefox ....
rick [t] tampaknya berhenti bekerja!
Seseorang di sini akan tahu apa yang terjadi, saya yakin.
Terima kasih.
command-line
bash
grep
Thorsen
sumber
sumber
Jawaban:
Ekspresi kurung siku adalah bagian dari
bash shell (dan cangkang lain juga)pencocokan pola kelas karakter grep.The
grep
Program secara default mengerti POSIX ekspresi reguler dasar. Dengan itu Anda dapat mendefinisikan kelas karakter. Sebagai contohps -ef | grep [ab9]irefox
akan menemukan " a irefox", " b irefox", " 9 irefox" jika ada, tetapi bukan " ab irefox".Perintah
grep [a-zA-Z0-9]irefox
itu bahkan akan menemukan semua proses yang dimulai dengan tepat satu huruf atau angka dan diakhiri dengan "irefox".Jadi
ps -ef | grep firefox
mencari baris denganfirefox
di dalamnya. Karena proses grep itu sendiri memiliki "firefox" di dalamnya, grep menemukan itu juga. Dengan menambahkan a[]
, kita hanya mencari kelas karakter "[f]" (yang hanya terdiri dari huruf "f" dan karenanya setara dengan hanya "f" tanpa tanda kurung). Keuntungan dari tanda kurung sekarang adalah bahwa string "firefox" tidak lagi muncul dalam perintah grep. Karenanya, grep itu sendiri tidak akan muncul dalam hasil grep.Karena tidak banyak orang yang akrab dengan tanda kurung siku sebagai pencocokan kelas karakter dan ekspresi reguler pada umumnya, hasil kedua mungkin terlihat sedikit misterius.
Jika Anda ingin memperbaiki hasil kedua, Anda dapat menggunakannya dengan cara ini:
(Referensi)
sumber
[f]
adalah braket pencocokan pola ekspresi reguler untuk kelas karakter. Seperti pada "[a-z0-9] irefox" grep akan cocok dengan "airefox" dan "0irefox" juga. Anda dapat dengan mudah melihat bahwa itu bukan bash bawaan karenaecho $([f])
mengembalikan kesalahan.[f]irefox
berfungsi untuk tujuan ini adalah tidak diperluas oleh shell. Ketika shell mengembang[f]irefox
kefirefox
, itu menyebabkangrep
untuk melihatfirefox
, dan kemudianfirefox
adalah bagian darigrep
string perintah, persis seperti jikagrep firefox
dijalankan. Tapi ada baiknya untuk mengingat pola shell yang cocok , terutama ketika scripting, karena jika ada file yang disebutfirefox
di direktori saat ini , maka shell tidak memperluas[f]irefox
kefirefox
dan metode ini gagal, yaitu,grep
garis darips
ditampilkan.Alasannya adalah karena string
cocok dengan polanya
firefox
, tetapi senarnyatidak cocok dengan polanya
[f]irefox
(yang setara dengan polanyafirefox
).Itu sebabnya grep pertama cocok dengan baris perintah prosesnya sendiri, sedangkan grep pertama tidak.
sumber