2015-05-31 4 views
6

Sto riscontrando un problema con grep. Ho un file http://pastebin.com/HxAcciCa che voglio controllare per alcuni modelli. E quando mi "sto cercando di cercare restituisce grep tutte le linee a condizione che il modello esiste già nel file specificato.Perché grep corrisponde a tutte le linee indipendentemente dal modello

per spiegare più questo è il codice che sto correndo

grep -F "ENVIRO" "$file_pos" >> blah  

No . importa che cosa provo, anche se mi forniscono un'intera linea come bash modello restituisce sempre tutte le linee
Queste sono varianti di quello che sto cercando:

grep -F "E20" "$file_pos" >> blah 
grep E20 "$file_pos" >> blah 
grep C:\E20-II\ENVIRO\SSNHapACS480.dll "$file_pos" >> blah 
grep -F C:\E20-II\ENVIRO\SSNHapACS480.dll "$file_pos" >> blah 

anche per alcune strane ragioni quando si aggiunge il - x opzione per grep, it non restituisce alcuna riga nonostante il pattern esatto esista.

Ho cercato il web e la documentazione di bash per la causa ma non ho trovato nulla.

Il mio test finale è stato il seguente

grep -F -C 1 "E20" "$store_pos" >> blah #store_pos has the same value as $file_pos 

ho pensato che forse stava stampando le righe dopo il risultato, ma che non era il caso. Stavo usando il file blah per vedere l'output. Anche io sto usando Linux rebecca alla menta. Infine, anche se la denominazione è abbastanza familiare questa domanda non è simile a Why does grep match all lines for the pattern "\'"

E infine vorrei dire che sono nuovo di bash. Sospetto che l'errore potrebbe essere dovuto al file principale http://pastebin.com/HxAcciCa piuttosto che al codice?

+1

Stai accodando a 'blah'. Dov'è la parte in cui la tronchi per essere vuota? –

+1

Cose come 'grep -F C: \ E20-II \ ENVIRO \ SSNHapACS480.dll" $ file_pos "' non può funzionare, i backslash devono essere preceduti da escape o quotati se vuoi che vengano passati a grep. Quindi: 'grep -F 'C: \ E20-II \ ENVIRO \ SSNHapACS480.dll'" $ file_pos "'. E questo può essere combinato con '-x'. Ma quel problema dovrebbe avere l'effetto opposto: non dovresti avere corrispondenze, piuttosto che ogni linea come una corrispondenza. – hvd

+1

problema con le terminazioni di riga nel file? controlla hexdump o 'cat -vET nomefile'. –

risposta

2

Dai commenti, sembra che il file abbia ritorni a capo delimitando le righe, piuttosto che i linefeed che si aspetta grep; di conseguenza, grep vede il file come una linea enorme, che corrisponde o non riesce a corrispondere nel suo complesso.

(Nota: ci sono almeno tre diverse convenzioni su come delimitare le linee di un "testo in chiaro" di file - Unix usa nuova riga (\n), DOS/Windows utilizza il ritorno a capo seguito da nuova riga (\r\n), e le versioni pre-OSX su MacOS usati ritorno solo del carrello (\r))

io non sono chiare su come il file in liquidazione in questo formato, ma si può risolvere il problema facilmente con:.

tr '\r' '\n' <badfile >goodfile 

o al volo con:

tr '\r' '\n' <badfile | grep ... 
+0

Grazie a te che l'hai risolto. Una domanda però perché il gatto stava leggendo '\ r' come^M piuttosto che '\ r'? – user1544624

+1

@ user1544624: Esistono diverse convenzioni per rappresentare i caratteri non stampabili. '\ r' (per" Return ") è la convenzione del linguaggio C, che è ampiamente utilizzata. Gli altri che potresti incontrare includono '^ M' (perché il ritorno a capo è Control-M nel codice ASCII),' '(per Carriage Return),' \ 015' (il codice carattere ASCII in ottale), e probabilmente altri I Non sto pensando a mano a mano. –

2
  1. Controllare le terminazioni di riga nel file di input: file, wc -l.
  2. Verificare che si stia effettivamente utilizzando il grep corretto: which grep.
  3. Utilizzare > per reindirizzare l'output o | more o | less per non essere confusi dai tentativi precedenti a cui si sta accedendo.

Modifica: Sembra che il file abbia terminazioni di riga errate (vecchio Mac OS (CR)). Se hai dos2unix puoi provare a convertirli in terminazioni di linea stile Unix (LF).

+0

Si prega di vedere i miei commenti su wc -l, inoltre sto usando il giusto grep i.e/bin/grep – user1544624

+1

Se hai dos2unix> = 7.1 puoi controllare le interruzioni di riga. $ dos2unix -i HxAcciCa.htm 369 125 0 no_bom testo HxAcciCa.htm come la vedo io, il file ha 369 interruzioni di DOS di linea, 125 interruzioni di linea Unix, Mac e 0 interruzioni di riga. Se hai accidentalmente convertito il file in interruzioni di linea Mac, usa il comando mac2unix per riconvertirlo in formato Unix –

1

Al momento non ho accesso a un PC, ma ciò che potrebbe aiutarti a risolvere il problema: 1. Usa grep --color -F per vedere se corrisponde correttamente. 2. Dopo la frase, usare | cat -A per vedere se ci sono dei caratteri di controllo sorprendenti, le righe dovrebbero terminare in $, qualsiasi altro carattere come \ I o \ M può a volte essere un mal di testa.

Sospetto il numero 2 come sembra essere l'output di Windows. Nel qual caso puoi usare cat nomefile | dos2unix | grep stmt dovrebbe risolverlo

Hai salvato l'output di dos2unix come un altro file? Basta ricontrollare il file, dovrebbe essere simile a questo:

[[email protected] ~]# cat -A Test.txt 
Windows^M$ 
Style^M$ 
Files^M$ 
Are^M$ 
Hard ^M$ 
To ^M$ 
Parse^M$ 


[[email protected] ~]# dos2unix Test.txt 
dos2unix: converting file Test.txt to Unix format ... 

[[email protected] ~]# cat -A Test.txt 
Windows$ 
Style$ 
Files$ 
Are$ 
Hard$ 
To$ 
Parse$ 

Ora dovrebbe analizzare correttamente - quindi basta verificare che lo ha fatto convertire il file in modo corretto Buona fortuna!

+0

Poiché ogni riga termina con^M significa che il formato è mac ?? Ho provato dos2unix ma non lo ha fatto t cambiare nulla. – user1544624

+1

^M indica il ritorno a capo, tipico dei file di Windows. Quindi, per prima cosa, esegui dos2unix filename per convertirlo in * nix style, quindi riprova la tua dichiarazione.È possibile che dos2unix non sia installato sul sistema, rendendo il processo in due passaggi un buon test – Werner

+0

Ho usato dos2unix ma non è stato di aiuto. il numero di nuova riga è ancora 0. – user1544624