2013-04-11 11 views
7

Per il mio lavoro, sono spesso alla ricerca di modelli nei file. Generalmente utilizzo lo grep --color=auto per colorare il modello di ricerca. Ora quando cerco modelli multipli, i quali dovrebbero essere presenti in una riga, io uso grep pattern1 file|grep pattern2|grep pattern3 o awk '/pattern1/&&/pattern2'. Ma in questo modo, in grep, perdo la colorazione che è molto utile per me, o in awk, non conosco alcun modo per colorare solo la stringa del pattern. Quando diventa troppo fastidioso, io uso grep pattern1 file|grep pattern2|grep pattern3|grep -E "pattern1|pattern2|pattern3".Utilizzo dell'output colorato per awk, o grep ricerca di più pattern in e condizioni

Quindi c'è qualche modo in grep per menzionare più pattern in e condizioni? (Penso che le espressioni regolari dovrebbero supportarlo, ma non è stato possibile trovarne, specialmente l'ordinamento dei pattern non è stato risolto)

Oppure c'è un modo per stampare a colori i modelli di ricerca awk?

Qualsiasi breve approccio compatto è il benvenuto (per userò molte volte al giorno)

+0

Vedere la mia risposta sul http://stackoverflow.com/a/6540890/297323 –

+0

@FredrikPihl ho cercato con awk stampa a colori in precedenza, tutti in realtà stanno formattando un campo, non un modello. Quindi posso fare il secondo campo in verde se voglio, ma non so se il mio schema arriverà nel secondo campo o nel terzo campo. Quello che voglio è che il pattern dovrebbe venire in verde, indipendentemente da dove sta arrivando. – abasu

risposta

6

È possibile utilizzare --color=always quando tubazioni da grep per mantenere il colore:

grep pat1 --color=always | grep pat2 
+0

Grazie @perreal, ha salvato il giorno :). Ma comunque, sono curioso, c'è un modo in grep per combinare i pattern in "e" condizione? Se è presente "o" condizione, perché "e" non è presente? Non sto parlando di pipe l'output, ma di un singolo grep, che cercherà le stringhe che contengono tutto il pattern dato, in qualsiasi ordine – abasu

+1

il modo di fare ed è 1) piping, 2) usando qualcosa come 'grep -e ' pat1. * pat2 '-e' pat2. * pat1 'input'. Forse manca perché è ridondante (non puoi 'o' con le pipe). – perreal

5

Si potrebbe costruire il proprio shell script/function utilizzando awk e codici di escape:

Dato il file Awk color text Quanto segue stampa il abbinato parola Awk in ciano:

$ awk '/Awk/{gsub(/Awk/,"\033[1;36m&\033[1;000m");print}' file 
Awk color test 

Questo principio può essere facilmente esteso per più modelli aggiunti This line ends here alla linea uno.

$ awk '/Awk/&&/This/{gsub(/Awk|This/,"\033[1;36m&\033[1;000m");print}' file 
Awk color test This line ends here. 

Partenza here per qualche informazione in più sui colori di shell.

+1

Grazie a @sudo_O, sapevo di gsub, ma non ho mai pensato di usarlo in questo modo. Risponde perfettamente alla seconda domanda. – abasu