Bir dosyanın belirli içeriğini yakalama


9

Bu yüzden bu sorun için araçlar olduğunu biliyorum çünkü onları duydum, ama ne olduklarını bilmiyorum.

/ Etc / passwd içindeki tüm verileri ancak kullanıcı adlarını filtrelemek gibi bir şey yapmak istiyorum.

Örneğin, user1, user2 ve user3'ü aşağıdaki dosyadan almak istiyorum. Bu durumda, mantık "Dosyanın her satırında ilk ':' metnine kadar metin yakala" olabilir.

user1:x:1:4
user2:x:2:5
user3:x:3:6

Çıktı:

user1
user2
user3

Yanıtlar:


19

cuttam olarak bu amaç için var. -dBayrak sınırlayıcı belirtir ve -fçıkışa alanları belirtir:

cut -d: -f1 /etc/passwd

Argümanı birinci ve üçüncü alanları göstermek ya da ilk üçünü göstermek -fgibi bir şey olabilir ; alanlar yerine bayt ve karakterleri okumak için ve işaretleri de vardır . Daha esnek bir şeye ihtiyacınız varsa, genellikle hile yapacak ( Matthew'un cevabına bakınız )1,31-3-b-cawk


13

Sekmeli bir girişten her veri çıkarmak istediğinizde, awk düşünmelisiniz . Neredeyse tüm Unix sistemlerinde kullanılabilir, bu yüzden almak iyi bir alışkanlıktır:

awk -F':' '{print $1}' /etc/passwd 
  • -F':': ":" sütununu sütun sınırlayıcısı olarak tanımlar.
  • '{}': bu komutu her satır için yürütün.
  • print $1: ilk sütunu ekrana yazdırmanızı sağlar.

3
Rastgele not: awkbir dosya adı alır, bu yüzden boruyu atlayıp sadece yapabilirsinizawk -F: '{print $1}' /etc/passwd
Michael Mrozek

Ben her zaman awk bir dosya adı alır unutmak gibi görünüyor, ben her zaman bir boru hattında kullanmak gibi görünüyor ... sed gibi bir şey | awk vb ...
Matthew Brannigan

dosyalarla çalışan hemen hemen her şey bir dosya adı alır ( trve çalışmayan atbirkaç şeyin birkaç örneğidir).
sonraki duyuruya kadar duraklatıldı.

3

İşte bir Perl tek katlı:

perl -F/:/ -lane 'print $F[0]' /etc/passwd

1

Perl ve awk altında, bu tür işler için sed olan üçüncü bir araç var:

sed 's/:.*//' FILE 

Bu ikame komutudur: iki nokta üstüste:: ardından herhangi bir sayıdaki (*) herhangi bir karakter için bir joker olan bir nokta, hiçbir şey olmadan.

TO'nun boş olduğu '(ubstitute) / FROM / TO /', yani 'her şeyi ilkinden sil (sed varsayılan olarak açgözlü olduğu için) kolon (satır sonuna kadar, sed tüm satırlarla iyi çalıştığı için) anlamına gelir.

Tabii ki cutde iyi bir komut ama farklı bir aileden söyleyebilirim.


1

Örneğinizde, 3 adın tümü aynı uzunluktadır. Böyle durumlarda - olabilir, ancak / etc / passwd ile bu kadar olası değildir - colrm'yi de kullanabilirsiniz:

echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3

veya tabii ki

cat FILE | colrm 6 

( useless use of catgeçerli olmadığı nadir bir durumdur , çünkü parametre olarak işlemek için bir DOSYAYI elle koyamazsınız.)


cathala işe yaramaz colrm 6 < FILE.
manatwork

Evet, ama aramada olduğu gibi işe yaramaz cat foo | grep bar.
kullanıcı bilinmiyor

1

Sadece bütünlük için, harici komutlara gerek yoktur, kabuk (Bourne kabuğu veya uyumlu) tek başına işleyebilir:

while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file

Tabii ki, bu muhtemelen tüm olası çözümlerin en yavaşıdır, bu nedenle büyük dosyalar için başka bir tane seçin.

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.