İyi bir yol
Normalde bunu grep ile yapamazsınız ancak diğer araçları kullanabilirsiniz. AWK daha önce de belirtilmişti ama şu şekilde de kullanabilirsiniz sed:
sed -e '1p' -e '/youpattern/!d'
Nasıl çalışır:
Sed yardımcı programı her satırda ayrı ayrı çalışır ve her birinde belirli komutları çalıştırır. Birkaç -eseçenek belirterek birden çok komutunuz olabilir . Her komutu, bu komutun belirli bir satıra uygulanıp uygulanmayacağını belirten bir range parametresiyle hazırlayabiliriz.
"1p" ilk komuttur. pNormalde tüm satırları basan komutu kullanır . Ancak, uygulanması gereken aralığı belirten sayısal bir değerle onu hazırlıyoruz. Burada, 1ilk satır anlamına gelir. Daha fazla satır yazdırmak istiyorsanız, yazdırılacak ilk satırın, yazdırılacak son satırın x,ypnerede xolduğunu kullanabilirsiniz y. Örneğin, ilk 3 satırı yazdırmak için,1,3p
Sonraki komut dnormalde tüm satırları tampondan siler. Bu komuttan önce yourpatterniki /karakter arasına koyduk . pKomutun çalışması gereken adresleme adresleri (ilk önce hangi komutları yaptığımız gibi ) belirtmekteydi . Bu, komutun yalnızca eşleşen satırlar için çalışacağı anlamına gelir yourpattern. Bunun dışında, mantığını tersine çeviren komuttan !önce karakter kullanırız d. Böylece, belirtilen kalıba uymayan tüm satırları kaldıracak .
Sonunda sed, tamponda kalan tüm satırları yazdıracaktır. Ancak, arabellekten uyuşmayan satırları kaldırdık, böylece yalnızca eşleşen satırlar yazdırılacak.
Özetlemek gerekirse: 1. satırı yazdırır, sonra da kalıbımızla eşleşmeyen tüm satırları girişten sileriz. Hatlar geri kalanı (yani sadece çizgiler basılır yapmak deseni eşleşir).
İlk satır problemi
Yorumlarda belirtildiği gibi, bu yaklaşımla ilgili bir sorun var. Belirtilen desen ilk satırla da eşleşirse, iki kez yazdırılır (bir defa pkomutla ve bir eşleşme nedeniyle bir kez). Bundan iki şekilde kurtulabiliriz:
1dSonra komut ekleme 1p. Daha önce de bahsettiğim gibi, dkomut satırları arabellekten siler ve 1 numaralı aralıklarla belirtiyoruz, bu yalnızca 1 satırı sileceği anlamına geliyor. Yani komut olurdused -e '1p' -e '1d' -e '/youpattern/!d'
Yerine 1bkomutu kullanma 1p. Bu bir numara. bkomut, bir etiket tarafından belirtilen diğer komutlara geçmemizi sağlar (bu şekilde bazı komutlar atlanabilir). Ancak bu etiket belirtilmezse (örneğimizde olduğu gibi), komutların sonuna atlar, satırımızın geri kalan komutlarını görmezden gelir. Yani bizim durumumuzda, son dkomut bu satırı tampondan çıkarmaz.
Tam örnek:
ps aux | sed -e '1b' -e '/syslog/!d'
Noktalı virgül kullanarak
Bazı seduygulamalar, birden çok -eseçenek kullanmak yerine komutları ayırmak için noktalı virgül kullanarak bazı yazılar yazdırabilir . Bu yüzden taşınabilir olmayı umursamıyorsanız, komut olacaktır ps aux | sed '1b;/syslog/!d'. En azından GNU sedve busyboxuygulamaları çalışır .
Çılgın yol
İşte, ancak, grep ile bunu yapmak için oldukça çılgın bir yol. Kesinlikle en uygun değil, bunu sadece öğrenme amaçlı gönderiyorum, ancak sisteminizde başka bir aracınız yoksa, örneğin kullanabilirsiniz:
ps aux | grep -n '.*' | grep -e '\(^1:\)\|syslog'
Nasıl çalışır
İlk -nönce, her satırdan önce satır numarası eklemek için bu seçeneği kullanırız. Eşleştiğimiz tüm çizgileri .*, her şeyi, hatta boş çizgiyi numaralandırmak istiyoruz . Yorumlarda önerildiği gibi, '^' ile eşleştirebiliriz, sonuç aynıdır.
Sonra genişletilmiş düzenli ifadeler kullanıyoruz, böylece \|OR olarak çalışan özel karakterleri kullanabiliriz . Bu nedenle, satır 1:(ilk satır) ile başlarsa veya desenimizi içeriyorsa (bu durumda syslog) eşleşiriz .
Satır numaraları sorunu
Şimdi sorun şu ki, çıktımızda bu çirkin satır numaralarını alıyoruz. Eğer bu bir problemse, bunları şu şekilde kaldırabiliriz cut:
ps aux | grep -n '.*' | grep -e '\(^1:\)\|syslog' | cut -d ':' -f2-
-dseçenek sınırlayıcıyı -fbelirtir, yazdırmak istediğimiz alanları (veya sütunları) belirtir. Bu yüzden her :karakterdeki her satırı kesmek ve sadece 2. ve sonraki tüm sütunları yazdırmak istiyoruz . Bu, ayırıcıyla ilk sütunu etkin bir şekilde kaldırır ve tam olarak ihtiyacımız olan şey budur.
ackyüzden faydalıdır ve nedenperlfırladı geçmişsed,awkvb popülaritesi: parçaları tutarlı bir bütün halinde özetlemek için daha önemlidir.