2016-11-10 1 views
3

Ich habe Linien auf meiner Standard-EingabeFilterlinien mit dem anderen Satz von Linien in Bash

$printf "C\nB\nA\n" 
C 
B 
A 

und ich möchte, um herauszufiltern Linien (oder Teil oder regexps - was einfacher ist), die auf andere Standardeingabe erscheinen :

$printf "B\nA\n" 
B 
A 

ich erwarte, dass nur C wenn Einträge gefiltert wird.

Ich habe versucht, mit

$printf "C\nB\nA\n" | grep -v `printf "B\nA\n"` 

Aber dann

ich bin immer
grep: A: No such file or directory 

Wie kann ich Filterung von Standardeingabe durch Linien von anderen Befehl zurückgegeben?

Antwort

6

können Sie verwenden grep ‚s -f Option:

Matching Control 
    -f FILE, --file=FILE 
      Obtain patterns from FILE, one per line. 
      [...] 

und verwenden Sie die <(command) Syntax für eine Ausgabe des Befehls als Inhalt verwendet werden:

$ printf "C\nB\nA\nA\nC\nB" | grep -vf <(printf "A\nB\n") 
C 
C 
2

Verwenden awk Kontrolle zu bekommen wie jede Linie zusammenpassen sollte:

$ printf "C\nB\nA\n" | awk 'NF == FNR { a[$0] = 1; next } a[$0]' \ 
    <(printf "A\nB\n") - 

Durch a[$0] Ändern können Sie festlegen, wie die einzelnen entsprechen sollten, dh Linien drucken von file1.txt die erste Spalte in file2.txt sind:

$ awk 'NF == FNR { a[$0] = 1; next } a[$1]' file2.txt file1.txt 
#         ^Print if column 1 from file1.txt 
#          is in file2.txt 

Um Zeilen aus file1.txt zu drucken, die in der Spalte enthalten sind, eine von file2.txt:

$ awk 'NF == FNR { a[$1] = 1; next } a[$0]' file2.txt file1.txt 
#         ^Print if line from file1.txt match 
#     ^Store column one from file2.txt 
0

U

und anschließend

012 verwenden können,
printf "C\nB\nA\n" | grep -v C | grep -v B 

dann

printf "C\nB\nA\n" | grep -v A | grep -v B 

, wenn Sie es aus einer Datei vorausgesetzt Datei enthält

C 
B 
A 

dann tun:

cat file | grep -v B | grep -v A 

druckt

C 

wenn Sie filtern möchten, indem Sie einmal kochend

cat file | grep -v 'B\|A' 
C 
+1

Die Sache ist die, dass meine beiden Eingänge dynamisch sind (basierend auf 'curl' Ergebnis) und ich will keine Zwischendateien erstellen. –

+0

das sollte auch funktionieren, mit Eingaben meinen Sie die zu filternden Felder? oder was du anbindest? Wenn es das ist, was du verpfeifst, dann ändere einfach 'cat file' auf was auch immer du willst, wenn ifs die zu filternde Stelle wo würde diese "Variable" herkommen? – maco1717

+0

Die zu filternden Zeilen und der Filter selbst sind dynamisch und durch Zeilenumbrüche getrennt (nicht '\ |'). Also '' curl input1 \ '| grep -v \ 'curl input2 \' 'funktioniert nicht –

Verwandte Themen