2016-04-12 8 views
0

Wie schneidet man ein bestimmtes Feld von einer Linie?Spezifische Felder mit Schnitt oder Awk

Das Problem ist, ich kann cut -d ' ' -f 1,2,3,4,5,9,10,11,12,13,14 nicht verwenden, da das Feld ändert.

Lassen Sie uns sagen, ich habe eine Datei namens/var/log/Test, und eine der Zeilen in der Datei sieht wie folgt aus:

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) 

Ich brauche nur den Benutzernamen und Datum/Uhrzeit zu erhalten (bitte Note Spalten ändern sich ständig, deshalb habe ich den Username = james.robert passen müssen und 12. April 07:48:11

Wenn ich.

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

nicht für mich arbeiten So hat es um den Benutzernamen zu vergleichen e und druckt nur Benutzername und Daten/Zeit. Irgendwelche Vorschläge?

Ok, so, wenn ich dies:

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

aber es funktioniert für einige Nutzer, aber nicht die anderen, weil Felder in Bewegung bleiben.

Die Probe Ausgabe dieses Befehls ist:

12 Apr 06.00.39 james.robert

Aber wenn ich auf diesem Benutzernamen diesen Befehl versuchen, funktioniert es nicht. Siehe unten:

hier ist ein weiteres Beispiel dafür, dass mit dem obigen Befehl nichts angezeigt:

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

Ist das erste Feld immer das Datum? –

+0

ja ist es. aber der Benutzername bleibt in Bewegung. –

+2

Wenn Sie bitte mehr als einen Datensatz als Beispiel veröffentlichen könnten. Sie wurden von ein paar von uns gefragt. Wir schießen im Dunkeln und können Ihre Randfälle nicht erraten. – JNevill

Antwort

1

, wenn Ihre Datei

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

Apr 12 07:48:11 james.robert 
konsequent strukturiert

, wenn Sie den Benutzernamen übereinstimmen müssen, Ihre Probeneingabe mit

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

UPDATE

OK, Ihre Räume nicht konsistent sind, zu beheben, um das -F

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

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

ändern Sie können das/pattern/hinzufügen, um die Übereinstimmung mit Benutzern wie oben zu beschränken. Beachten Sie die Änderung der Option -F.

-F' +|,' setzt die Feldtrennzeichen in Leerzeichen (einem oder mehr) oder ein Komma, der Rest die Felder ist das Zählen und den richtigen drucken aufnimmt. /pattern/ wird die Zeilen filtern, die dem Regex-Muster entsprechen, das nur auf ein bestimmtes Feld beschränkt sein kann (z.12) durch $12~/pattern/

, wenn Ihr Text gemischt Fall enthalten kann und Sie Groß- und Kleinschreibung verwenden tolower() Funktion, zum Beispiel

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

Es gibt mir andere Ergebnisse. Und wo passt der Benutzername? –

+0

posten Sie bitte, was Sie erwarten zu sehen und was Sie haben. – karakfa

+0

Ok, das funktioniert viel besser, aber es gibt immer noch einige Probleme. Hier ist die Sache, ist es nicht möglich, das Datum und den Benutzernamen und das Datum auf andere Weise zu bekommen? weil es für 2, 3 Benutzer arbeitet, aber wenn ich 4. Benutzer mit einem anderen Namen eintippe, zeigt es nichts. Gibt es einen anderen Mechanismus? –

0

Sie awk durch Komma zu begrenzen verwenden könnte und dann verwenden substr() und length() bei den Stücken um Sie kümmern über:

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

es gibt mir einen Fehler. Auch wo versucht das überhaupt den Benutzernamen zu finden? –

+0

Es ist nicht die Annahme hier ist, dass die Platzierung der Kommas konsistent sind, so dass Ihr 'username =' Feld in der 3. Position ist. – JNevill

+2

Vielleicht ... wäre es hilfreich, wenn Sie mehr als einen Datensatz in Ihre Protokolldatei aufgenommen hätten, damit wir uns ein Bild von den verschiedenen Formaten machen können, in denen sich diese Datensätze befinden. Das Beste, was wir tun können, ist so umfangreich wie wir kann erraten, und hoffe, dass es alle deine Randfälle erfasst. Ohne anders formatierte Datensätze zu sehen, ist es schwer zu erraten. – JNevill

1

Mit sed:

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

Es gab mehr Informationen als ich brauchte. Auch wo versucht es den Benutzernamen zu finden? Weil sich die Felder in Bewegung halten. –

+0

@RomiKajaki, '(Benutzername = [^,] *)' stimmt mit dem Benutzernamen überein und die Daten werden gruppiert. Sie können diese Gruppe später in der Substitution mit '\ 2' (2. Gruppe) referenzieren. – sat

0

Mit gawk

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

Hat nicht funktioniert. Es zeigt alles! Ich brauche nur Benutzername und Datum. Ich mag: Apr 12 07:48:11 james.robert –

0

Das folgende Perl druckt das Datum und den Benutzernamen, abgegrenzt durch eine Registerkarte. Fügen Sie zusätzliche gültigen Benutzernamen Zeichen [\w.]:

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

unterschiedliche Mengen eine Tabulatoren und Leerzeichen erlaubt sind.