2016-06-03 6 views
-1

Ich möchte fragen, um extrahieren, wie grep zu verwenden, um diese mutigen Worte unten zu extrahieren:Wie bestimmtes Wort und Speicher auf eine Variable mit grep

Betreff: [drucken] [Drucker-tj]

Von: John Smith < [email protected]>

An: [email protected]

Content-Type: text/html; charset = UTF-8 Content-Transfer-Encoding: quoted-printable

Content-Type: application/pdf; name = "a.pdf"

Zum Beispiel habe ich diese Worte zu verschiedenen Variablen speichern möchten:

a = printer-tj 

b = [email protected] 

c = application/pdf 

d = a.pdf 

Wie es erkennen, grep?

Wie ich weiß, dass ich wie diese verwenden können, aber ich bin mir nicht sicher, ob dies richtig ist:

a = grep -Po 'Subject: [print][\K[^]]+' 
+0

Aufwendige ** diese fett Wörter unten ** bitte .. Die Frage am moment.Post unsalvageable ist ein [\ [** MCVE * * \]] (http://stackoverflow.com/help/mcve). – sjsam

Antwort

1

bin mir nicht sicher, was Ihr Ziel ist es, alle Variablen zu speichern, wie Sie benötigen. Aber hier geht mein Versuch: -

#!/bin/bash 

a=$(grep -w "Subject:" file | awk '{print $2}' | sed 's/.*\[\([^]]*\)\].*/\1/g') 

b=$(grep -w "From:" file | awk 'NR>1{print $1}' RS="<" FS=">") 

c=$(grep -w "Content-Type:" file | awk 'NR>1{print}' | awk -F";" '{print $1}' | cut -d ":" -f2) 

d=$(grep -w "Content-Type:" file | awk 'NR>1{print}' | awk -F";" '{gsub(/"/, "", $2); print $2}' | cut -d "=" -f2) 

Wird die Ausgabe produzieren, wenn echo d zu stdout‘.

printer-tj 
[email protected] 
application/pdf 
a.pdf 
+4

Chaining 'grep' und' awk' machen wenig Sinn, da 'awk' alles kann' grep' kann. Verkettung mehrerer Aufrufe von "Awk" ist noch schlimmer. –

+0

Bin gerade ein Anfänger in 'awk', bitte bieten Sie effektivere Lösungen an. Ich habe nie angedeutet, dass meine optimal ist. – Inian

+2

Nun, sowas wie 'awk' NR> 1 {print} '| awk -F ";" '{print $ 1}' 'ist äquivalent zu' awk -F; " 'NR> 1 {print $ 1}' '. Sie können jede Verwendung von 'cut' durch ein besseres 'awk'-Feldtrennzeichen ersetzen, und' grep' ist dasselbe wie ein' awk'-Mustervergleich. –

1

Diese Lösung ist etwas prägnanter:

#!/bin/bash 
awk 'BEGIN { FS="[\\[\\]<>\"; ]+" } 
/^Subject:/ { a = $3; next; } 
/^From:/ { b = $4; next; } 
/^Content-Type:/ { c = $2; d = $4; next; } 
END { print a, b, c, d; }' file | read a b c d 
+0

Wenn abcd aufgerufen wird, zeigt es nichts während es ignoriert wird es wird angezeigt wie ich will So wie kann ich das Ergebnis verwenden außerhalb awk, weil ich a, b, c, d-Wert für meinen nächsten Code benötige, übrigens, b wird Smith Nr. produzieren diese E-Mail. – user2290560

+0

@ user2290560 Ah, ja, das sollte $ 4 für die Emailadresse sein.Ich habe es jetzt behoben. Natürlich müssen Sie berücksichtigen, dass die Pipe eine neue Subshell erstellt. Also benutze '{lese a b c d; echo $ a} 'oder was auch immer. –

+0

Ja, es funktioniert jetzt. Jedoch vielleicht diese Lösung nur für den begrenzten Fall. Es funktioniert nicht, wenn From einen anderen Namen hat (manchmal hat der Name der Leute mehr als 3 Wörter) und der Dateiname enthält mehr Wörter als ein Wort (zB nicht a.pdf sondern ein Beispiel.pdf) – user2290560

Verwandte Themen