Grep'teki bu [t] ricky parantezi ifadesi nasıl çalışır?


38

Son zamanlarda bu tek astarı gördüm:

$ ps -ef | grep [f]irefox 

thorsen   16730     1  1 Jun19 ?        00:27:27 /usr/lib/firefox/firefox ...

Dolayısıyla, verilerde "firefox" içeren işlemlerin listesini döndürür, ancak grep işleminin kendisini dışlar ve bu nedenle aşağıdakine eşdeğer görünür:

ps -ef |grep -v grep| grep firefox

Nasıl olsa işe yaradığını anlayamıyorum. Grep ve başka yerlerdeki man sayfasına baktım ancak bir açıklama bulamadım.

Ve kaçarsam gizemi arttırmak için:

$ 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 ....

[t] rick çalışmayı durduruyor gibi görünüyor!

Buradaki birileri neler olup bittiğini bildiğinden eminim.

Teşekkürler.


Hmm, bunun doğru olduğuna emin misin? ps -eaf | grep [fF] irefox daha anlamlı olur. Bu normal bir ifadeye benziyor ve ekli karakterlerden herhangi biriyle eşleşiyor. Ayrıca aralık olarak da yapılabilir, örneğin [0-9]
mbs

İyi evet. Karşılaştığım sorun buydu: Sadece bir karakter içeren bir karakter sınıfı henüz anlamsız görünüyordu, ancak "gizemli" bir yan etki yaratıyordu! Her neyse, jokerdino iyi bir açıklamada bulundu.
Thorsen

Yanıtlar:


57

Köşeli parantez ifadesi, grep'in karakter sınıfı desen eşleşmesinin bash kabuğunun (ve diğer kabukları da) bir parçasıdır .

grepVarsayılan olarak programın POSIX temel düzenli ifadeler anlar. Bununla karakter karakterlerini tanımlayabilirsiniz. Örneğin , eğer " ab irefox" olmasa, ps -ef | grep [ab9]irefox" a irefox", " b irefox", " 9 irefox" u bulur.

Komut grep [a-zA-Z0-9]irefox, tam olarak bir harf veya rakam ile başlayan ve "irefox" ile biten tüm işlemleri bile bulur.

Böylece içindeki ps -ef | grep firefoxsatırları arar firefox. Grep işleminin kendisinde "firefox" olduğu için, grep de bunu bulur. A ekleyerek [], yalnızca "[f]" karakter sınıfını arıyoruz (yalnızca "f" harfinden oluşur ve parantez olmadan sadece "f" ye eşdeğerdir). Şimdi parantezlerin avantajı, artık "firefox" dizesinin grep komutunda artık görünmemesidir. Bu nedenle, grep'in kendisi grep sonucunda görünmez.

Pek çok insan karakter sınıfı eşleştirme ve genel olarak düzenli ifadeler gibi köşeli parantezlere aşina olmadığından, ikinci sonuç biraz gizemli görünebilir.

İkinci sonucu düzeltmek istiyorsanız, bunları şu şekilde kullanabilirsiniz:

ps -ef | grep [f]irefox  > data
grep firefox data

(Referans)


1
Hmm. Bana gelmedi [], grep'ten ÖNCE kabuğun bile yorumladığı bir şeydi. Açıklama için teşekkürler. Tüm [m] yuvalar çözüldü.
Thorsen,

Memnuniyetle yardım ettim. İyi günler :)
jokerdino

1
Bash, köşeli ayraç olacak Bulundukları sözcük eşleşme varsa grep geçirilecek (yani geçerli dizinde "firefox" adında bir dosya). Ancak, grep karakter sınıflarına da sahiptir ve grep'teki [f], f ile aynıdır.
Daniel Hershcovich

6
Aslında bu durumda grep öncesi kabuk tarafından yorumlandığını sanmıyorum. [f]Karakter sınıfları için düzenli ifade kalıbı eşleştirme braketi olduğunu düşünüyorum . "[A-z0-9] olduğu gibi, irefox" grep, "airefox" ve "0irefox" ile de eşleşir. echo $([f])Hata döndürdüğünden beri bir bash yerleşik olmadığını kolayca görebilirsiniz .
con-f kullanımı

4
Özel bir nedeni [f]irefoxbu amaçla çalışmalar bunun olmasıdır değil kabuk tarafından genişletilmiş. Ne zaman kabuk genişlediğinde [f]irefoxiçin firefoxnedenler olduğunu, grepgörmek firefoxve daha sonra firefoxbir parçasıdır greptam sanki bireyin komut dizesi grep firefoxçalıştırmak bulundu. Ama 's iyi akılda kabuk desen denk tutmak için , özellikle komut dosyası, çünkü adlı bir dosya varsa firefoxgeçerli dizinde , daha sonra kabuk mu genişletmek [f]irefoxiçinfirefox ve bu yöntem, yani başarısız grepgelen çizgi psgösterilir.
Eliah Kagan

10

Bunun nedeni dizgenin

grep firefox

desenle eşleşir firefoxancak dize

grep [f]irefox

desenle eşleşmiyor [f]irefox( desene eşdeğer firefox).

Bu yüzden ilk grep, kendi işlem komut satırına uyurken ikincisi eşleşmiyor.


Bu, kafamı daha da acıtıyor
Pithikos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.