gatto * | grep qualcosa ... in che file è il risultato?


8

Se uno dovesse eseguire il seguente comando

cat * | grep DATABASE

la shell sputava tutte le righe in * file che contenevano la parola DATABASEin esse. C'è un modo per sputare anche quale file è separato da ogni riga?

Ho provato ad usare l' -Hopzione per grep che secondo mandice print the filename for each matchma nella mia shell dice solo

(standard input):$DATABASE_FUNCTION = dothis();

buona domanda. Sto ancora cercando di rompere il gatto -> abitudine grep me stesso. :)
Sirex,

Risposte:


22

Non usare il gatto per quello. Usa invece grep DATABASE *o grep -n DATABASE *(se vuoi conoscere direttamente i numeri di riga e i nomi dei file).

Vedi l' uso inutile del gatto .

Per chiarire un po 'di più: in cat *realtà concatena tutti i file mentre li alimenta per grep attraverso la pipe, quindi grep non ha modo di sapere quale contenuto appartiene a quale file e in effetti non può nemmeno sapere davvero se sta eseguendo la scansione dei file o solo digitando molto velocemente. È tutto un grande flusso di input standard una volta che si utilizza una pipe.

Infine, -Hè quasi sicuramente ridondante poiché grep stampa il nome file per impostazione predefinita quando ha più di un file da cercare. Potrebbe essere utile nel caso in cui si desideri analizzare l'output, tuttavia, poiché esiste una possibilità che il *glob si espanda in un singolo file e grep in tal caso ometterebbe il nome del file.


6

Usa grep -H DATABASE *(nota: se c'è più di un file nella directory, -Hè facoltativo).

Il problema che stai riscontrando è che con il tuo comando cat *concatena tutti i file in un unico grande casino, e poi li |invia nell'input standard di grep DATABASE. Quando grep vede i dati, le informazioni su da dove provengono sono state perse. La soluzione è fare in modo che grep faccia il lavoro di ricerca tra i singoli file, quindi quando trova una corrispondenza sa da quale file proviene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.