2017-11-03 4 views
2

Wie ich weiß, nur das Muster mit dem Befehl grep -o zu drucken. ich habe eine Datei wie folgt:Nur das Muster in der ganzen Zeile mit grep drucken

Job <472971> Job Name <aaaaaaaaaaa> User <bbbbbbbbb> Project <cccccc> Status <RUN> Queue <AL_Ptime>Interactive pseudo-terminal shell mode Submitted from host <lsf_login07> CWD </asdfghjklll/dsadasd/asda> 

ich will das Muster alle in < > auszudrucken, mein Wunsch Ausgabe wie folgt aussehen:

<472971> <aaaaaaaaaaa> <bbbbbbbbb> <cccccc> <RUN> <AL_Ptime> <lsf_login07> </asdfghjklll/dsadasd/asda> 

ich viel versucht, aber ich kann genau auszudrucken Muster < >.

Danke für Ihre Hilfe!

Antwort

1

So etwas wie grep -oE '<[^>]+>':

$ echo "Job <472971> Job Name <aaaaaaaaaaa> User <bbbbbbbbb> Project <cccccc> Status <RUN> Queue <AL_Ptime>Interactive pseudo-terminal shell mode Submitted from host <lsf_login07> CWD </asdfghjklll/dsadasd/asda>" \ 
| grep -oE '<[^>]+>' 
<472971> 
<aaaaaaaaaaa> 
<bbbbbbbbb> 
<cccccc> 
<RUN> 
<AL_Ptime> 
<lsf_login07> 
</asdfghjklll/dsadasd/asda> 

Wenn Sie die Zeilenumbrüche und Leerzeichen müssen loszuwerden zwischendurch, können Sie Rohr dies in einem einfachen awk wie folgt aus:

grep -oE '<[^>]+>' | awk '{printf "%s%s", (NR==1?"":" "), $0}' 

oder mit tr:

grep -oE '<[^>]+>' | tr "\n" " " 

EDIT: Angenommen OP eine Eingabedatei mit einer Anzahl dieser Linien verwendet, könnte man zu GNU drehen awk:

$ cat tst.awk 
BEGIN { FPAT="<[^>]+>" } 
{ for (i=1; i<=NF; i++) printf "%s%s", (i==1?"":" "), $i 
    printf "\n" 
} 

es zu benutzen:

awk -f tst.awk file 

wo Datei ist:

$ cat file 
Job <472971> Job Name <aaaaaaaaaaa> User <bbbbbbbbb> Project <cccccc> Status <RUN> Queue <AL_Ptime>Interactive pseudo-terminal shell mode Submitted from host <lsf_login07> CWD </asdfghjklll/dsadasd/asda> 
Job <472971> Job Name <aaaaaaaaaaa> User <bbbbbbbbb> Project <cccccc> Status <RUN> Queue <AL_Ptime>Interactive pseudo-terminal shell mode Submitted from host <lsf_login07> CWD </asdfghjklll/dsadasd/asda> 

oder als Einstrich:

$ awk 'BEGIN{FPAT="<[^>]+>"} \ 
     {for (i=1; i<=NF; i++) printf "%s%s", (i==1?"":" "), $i; printf "\n"}' file 
<472971> <aaaaaaaaaaa> <bbbbbbbbb> <cccccc> <RUN> <AL_Ptime> <lsf_login07> </asdfghjklll/dsadasd/asda> 
<472971> <aaaaaaaaaaa> <bbbbbbbbb> <cccccc> <RUN> <AL_Ptime> <lsf_login07> </asdfghjklll/dsadasd/asda> 
+0

tks Marc es ist Arbeit. Aber ich habe ein anderes Problem Ich habe viele Zeilen, die in der Datei, die viele Jobs enthalten, so dass die Ausgabe wird auch viele Zeile haben, dort für die awk Befehl funktioniert nicht gut Ich frage mich, meine Ausgabe kann viele Zeilen wie mein Wunsch haben Ausgabe? – Lucil120

+0

Lösung zu meiner Antwort hinzugefügt. –

+0

Danke Marc Wenn ich diese awk Datei verwende, muss ich den Befehl grep verwenden? Denn wenn ich nur die awk-Datei verwende, sieht die Ausgabe einfach wie die Eingabedatei aus. Oder die Eingabedatei dieser awk-Datei ist die Ausgabedatei nach dem Befehl grep? Ich habe beide versucht, aber es funktioniert auch nicht – Lucil120

Verwandte Themen