/ / Utilizzo di Grep con Xargs e sostituzione del processo - grep, pipe, stdin, xargs, sostituzione del processo

Uso di Grep con Xargs e Sostituzione del processo: grep, pipe, stdin, xargs, sostituzione del processo

Sto cercando di passare la query grep tramite xargs mentre passo il file attraverso la sostituzione del processo.

command1 | xargs -I{} grep {} <(command2)

creare file fittizi

for f in {1..50}; do echo $f >> test50.txt; done

for f in {25..30}; do echo $f >> test5.txt; done

xarg e sostituzione di processo con grep

cat test5.txt | xargs -I{} grep {} <(cat test50.txt)

l'output è:

25

l'output desiderato è:

25
26
27
28
29
30

Penso che il problema risieda nel modo in cui grep sta ricevendo il file di input, si ferma dopo una riga, mentre mi piacerebbe che cercasse l'intero file di input

risposte:

2 per risposta № 1

Con GNU Parallel sembra che questo:

cat test5.txt | parallel "grep {} <(cat test50.txt)"

1 per risposta № 2

Considera questo

cat test5.txt | xargs -I{} cat {} <(cat test50.txt)

uscite

cat: 25: No such file or directory
1
2
--cutted for brevity--
49
50
cat: 26: No such file or directory
cat: 27: No such file or directory
cat: 28: No such file or directory
cat: 29: No such file or directory
cat: 30: No such file or directory

Non si tratta di grep, ma process substitution. Crea una named pipe e tutti i dati da quella pipe vengono consumati per primi grep (o cat come nell'esempio sopra) invocazione.

Questo funzionerà

cat test5.txt | xargs -I{} bash -c " grep {} <(cat test50.txt)"

poiché crea in modo indipendente la sostituzione del processo per ogni esecuzione di grep.


0 per risposta № 3

non c'è bisogno di xargs come grep ha già un modo per specificare i termini di ricerca da un file

$ seq 50 > f1
$ seq 25 30 > f2
$ grep -Fxf f2 f1
25
26
27
28
29
30

A partire dal man grep

-F, --file fisse Interpretare PATTERN come una lista di stringhe fisse (invece di espressioni regolari), separate da newline, ognuno dei quali deve essere abbinato.

-x, --line-regexp Seleziona solo le partite che corrispondono esattamente all'intera linea. Per un modello di espressione regolare, questo è come parentesi il modello e poi lo circondano con ^ e $.

-f FILE, --file = FILE Ottieni pattern da FILE, uno per riga. Se questa opzione è utilizzata più volte o è combinata con l'opzione -e (--regexp), cerca tutti i modelli dati. Il file vuoto contiene zero pattern e quindi non corrisponde a nulla.