Sed ile bir dosyadan bir satırın bir kısmını çıkart


18

Bir satırın bir kısmını bir dosyadan okumak istiyorum. Örneğin:

POP3_SERVER_NAME = localhost

localhostSed kullanarak sadece geri dönmek istiyorum .

Bu metin üçüncü satırda. Bunu çizgi ayıklamak için yapıyorum:

sed -n '3p' installation.sh

Sadece localhostparçayı nasıl çıkarırım ?

Yanıtlar:


26

awk burada daha iyi bir araç olabilir.

$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost

"POP3_SERVER_NAME" içeren satırları arayın; son alanı yazdırın. Bu, POP3_SERVER_NAME adlı kullanıcının her zaman 3. satırda olmasına bağlı değildir, bu muhtemelen İyi Bir Şeydir.

$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost

Uygulamanıza bağlı olarak, normal ifadeyi daha katı hale getirmeniz gerekebilir. Örneğin, yalnızca POP3_SERVER_NAME ile başlayan çizgiyi eşleştirmek isteyebilirsiniz.

$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost

Sed kullanmak biraz daha az sezgiseldir. (Teşekkürler, ironinin farkındayım.) Her yerde POP3_SERVER_NAME içeren satırı ele alın. Satırın başından itibaren "=" işaretinden sonra isteğe bağlı alana tüm metin için boş bir dize yazın. Sonra yazdırın.

sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat

2
awkKomut güzel - ama etrafında boşluk var sadece =. Bu işe yaramaz POP3_SERVER_NAME=localhost.
Marcel Stör

2
@Marcel, Kullanılan sınırlayıcıyı awkboşluklardan kullanarak başka bir şeye değiştirebilirsiniz -F. Örneğin: bahsettiğiniz durumda bir sınırlayıcı olarak -F "="kullanılır =.
mattpr

7

pKomutu, satırın istenmeyen kısmını kaldıran bir ikameyle değiştirin .

sed -n '3 s/^[^=]*= *//p' installation.sh

Satırı konuma göre değil, anahtar kelimeyle eşleştirmek isteyebilirsiniz.

sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh

6

Bir yapılandırma dosyanız var gibi görünüyor. Yapabileceğiniz şey Adam Siemeon / slm'nin önerilerine benzer:

sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename

yerde [^=]hariç tüm '=' karakterler, +bir veya daha fazla karakter aynı tip, bu gerçek bir takip söyler =, \ssekme gibi herhangi bir boşluk ( \tve yeni hatları \n, \r\nve düz alanların '' ise *aracı sıfır ya da daha fazla aynı tipte , parantez 2, ..., \ n yedek tutucuları, \ \ 1 içine eşleşti karakter dizilerini yerleştirmek için içinde ne yakalamak $bir satırın sonuyla demektir Bu tipik yedek bir yol izler. s/.../.../modifiers. komut satırı seçeneği -raçılımı genişletilmiş düzenli ifade sözdizimi (kolaylık olması açısından) ve -naçıkça talep edilene kadar veya istenmedikçe hiçbir şey çıktı alma anlamına gelir p.

gDeğiştirici ile global bir arama yapabilirsiniz :

sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename  # note the space after \1

böylece ayrılmış bir dize almak ' '(olabilir \n, \tya da ne var) kolayca işleyebilir.

Her ikisi de değerlerinizin önünde bir satırın sonuna kadar denklem karakteri sürmesi ve ardından yorum veya basit bir "değer" den farklı anlambilimine sahip diğer karakterler gelmemesi koşuluyla geçerlidir.


Düzenle:

Burada başkalarının yayınlarına henüz yorum yapamam. Satırı belirtmek için, 3 numaralı durumda s, başlangıç ​​teklifinden önce veya önce satır numarasını iletin (tıpkı vim'de olduğu gibi).

sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename

Lütfen bir göz atın info sed. Örneğin, 3.2 ve 4.7 sizin için özellikle önemlidir.


5
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost

Veya bir dosyadaki içeriğe sahipseniz:

sed 's/.*= //' somefile.txt
localhost

tamam, ama benim dosyada böyle okuyun: sed -n '3p' installation.sh
Mercer

2
@Mercer - cevaba eklediğim güncellemeleri görün.
slm

@Adam Siemion - teşekkür ederim, ama satır numarasını nasıl gösteririm?
Mercer

4

Kesme komutunu kullanarak sınırlayıcıyı '=' olarak ayarlayabilir ve ardından ikinci alanı aşağıdaki gibi yazdırabilirsiniz:

cut -d'=' -f2

3

Dosyanızın adı düşünüldüğünde bunu yapmanın birden çok yolu foobar:

Aranacak kalıbı belirtin:

PAT=POP3_SERVER_NAME

Kullanarak ayıkla sed

sed -n "/$PAT/p" foobar | sed "s/$PAT = //"

Veya sedvecut

sed -n "/$PAT/p" foobar | cut -d' ' -f3

2

Linux / Unix'in güzelliği, bir şeyi başarmanın genellikle birden fazla yolu olmasıdır. Operasyon durumunda, dosyadan POP sunucusu adını çıkarmanın en az dört farklı yolu vardır:

  1. grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2
  2. grep POP3_SERVER_NAME installation.sh | awk '{print $3}'
  3. grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'
  4. sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
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.