2016-04-12 12 views
0

Belirli bir alanı bir satırdan nasıl kesebilirim?Kesilmiş veya Awk kullanan belirli alanlar

Sorun, alan değiştiğinden cut -d ' ' -f 1,2,3,4,5,9,10,11,12,13,14 kullanamıyorum.

ı/var/log/test adlı bir dosya varsa ve dosya içindeki satırlardan birini şöyle diyelim:

Apr 12 07:48:11 172.89.92.41 %ASA-5-713120: Group = People, Username = james.robert, IP = 219.89.259.32, PHASE 2 COMPLETED (msgid=9a4ce822) 
Sadece Adı ve Zaman/Tarih almak gerekir

(lütfen

grep "james" /var/log/tes | cut -d ' ' -f 1,2,3,4,5,9,10,11,12,13,14 

benim için çalışmaz sahip olduğu Yani:. not sütunları ı kullandığınızda ben adı = james.robert eşleşmesi gerekir nedeni budur ve Nis 12 07:48:11

, sürekli değişiyor usernam ile eşleştirmek e ve sadece kullanıcı adı ve veri/zaman yazdırır. Baska öneri? Tamam

yüzden bu kullandığınızda:

awk -F'[ ,]' '$12~/username/{print $1,$2,$3,$12}' /var/log/test 

ancak bazı kullanıcılar için çalışır, ancak diğerleri değil, alanlar ilerlemeye devam çünkü.

12 Nisan 06:00:39 james.robert

Ama bu kullanıcı bu komutu çalıştığınızda, çalışmıyor:

bu komutun çıktısı örneği. Aşağıya bakın: Eğer bakım parçalara ulaşmak için substr() ve length() kullanmak ardından virgül ile ayırmak için awk kullanıp,

Apr 8 12:16:13 172.24.32.1 %ASA-6-713228: Group = people, Username = marry.tarin, IP = 209.157.190.11, Assigned private IP address 192.168.237.38 to remote user 
+0

İlk alan her zaman tarih midir? –

+0

evet öyle. ama kullanıcı adı hareket etmeye devam ediyor. –

+2

Örnek olarak birden fazla kayıt gönderebilirsiniz. Bir kaçımız tarafından sorulmuştunuz. Karanlıkta çekim yapıyoruz ve kenar durumlarınızda tahmin edemiyoruz. – JNevill

cevap

1

dosya

awk -F'[ ,]' '{print $1,$2,$3,$12}' file 

Apr 12 07:48:11 james.robert 
sürekli yapılandırılmış olup olmadığını

Eğer numune girişi

$ awk -F'[ ,]' '$12~/james/{print $1,$2,$3,$12}' file 
Apr 12 07:48:11 james.robert 

GÜNCELLEME

Tamam kullanarak, kullanıcı adı, aynı gerekiyorsa, senin alanlarda tutarlı değildir, -f

$ awk -F' +|,' '{print $1,$2,$3,$12}' file 

Apr 12 07:48:11 james.robert 
Apr 8 12:16:13 marry.tarin 

değiştirmek düzeltmek için Eşleşmeyi yukarıdaki gibi kullanıcılarla sınırlamak için/pattern/öğesini ekleyebilirsiniz. -F seçeneğindeki değişikliği not alın.

-F' +|,'

boşluk (bir veya daha fazla) veya virgül, dinlenme alanları sayma ve yazdırmak için doğru olanı toplayıp olduğu saha ayırıcı ayarlar. /pattern/, regex deseniyle eşleşen satırları filtreleyecek ve bu da sadece> belirli bir alana sınırlanmış olabilir (ör.12) $12~/pattern/

tarafından metin sed ile örnek

$ awk -F' +|,' 'tolower($12)~/patterninlowercase/{print $1,$2,$3,$12}' file 
+0

Bana farklı sonuçlar veriyor. Ve ayrıca kullanıcı adıyla nerede eşleşiyor? –

+0

lütfen, ne görmeyi beklediğinizi ve ne elde ettiğinizi gönderin. – karakfa

+0

Tamam, bu çok daha iyi çalışıyor, ancak hala bazı sorunlar var. İşte, tarih ve kullanıcı adı ve tarihini farklı bir şekilde almak mümkün değil mi? çünkü 2, 3 kullanıcı için çalışıyor, ancak farklı bir ada sahip 4. kullanıcı yazdığımda hiçbir şey göstermiyor. Başka mekanizma var mı? –

0

: Burada

yukarıdaki komutla şey göstermediği başka bir örnektir about:

awk -F"," '{print substr($1,1,15), substring($3, 13, length($3)-12)}' /var/log/test 
+0

bana bir hata veriyor. Ayrıca bu, kullanıcı adıyla eşleşmeyi nerede dener? –

+0

Buradaki varsayım, virgüllerin yerleştirilmesinin tutarlı olması, böylece "kullanıcı adınız" alanınızın 3. konumda olmasıdır. – JNevill

+2

Belki de ... günlük dosyanızdan birden fazla kayıt eklediyseniz, bu kayıtların olabileceği farklı formatlar hakkında fikir sahibi olabileceğimiz için yararlı olur. Tahmin edebilir ve tüm kenar durumlarınızı yakalayacağını umarız. Yine de farklı formatlanmış kayıtlar görmeden, bunları tahmin etmek zor. – JNevill

1

için, vaka karışık ve, vaka duyarsız olması tolower() fonksiyonunu kullanmak istiyorsanız içeriyor olabilir eğer:

sed -r 's/^([A-Za-z]{3} [0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}).*(Username = [^,]*).*/\1 \2/g' file 
+0

İhtiyacım olandan daha fazla bilgi verdi. Ayrıca kullanıcı adıyla eşleşmeyi nerede dener? Çünkü alanlar hareket etmeye devam ediyor .. –

+0

@RomiKajaki, '(Kullanıcı adı = [^,] *)' kullanıcı adıyla eşleşecek ve veriler gruplanacak. Bu grubu daha sonra '\ 2' (2. grup) kullanarak ikameye gönderebilirsiniz. – sat

0

gawk ile

awk '{u=gensub(/.*(Username = [^,]*).*/,"\\1","g",$0);if (u ~ "james") {print u,$1,$2,$3}}' file 
+0

Çalışmadı. Her şeyi gösterir! Sadece kullanıcı adı ve tarihe ihtiyacım var. Gibi: Apr 12 07:48:11 james.robert –

0

Aşağıdaki perl, bir sekmeyle ayrılmış tarihi ve kullanıcı adını yazdıracaktır. [\w.] ek geçerli bir kullanıcı adı karakterleri ekleyin:

perl -ne ' 
    print $+{date}, "\t", $+{user}, "\n" if 
     /^(?<date>([^\s]+\s+){2}[^\s]+).*\bUsername\s*=\s*(?<user>[\w.]+)/ 
    ' 

Değişen bir sekme tutarları ve boşluklar izin verilir.