2011-08-30 15 views
11

Sto utilizzando grep per produrre l'output che verrà analizzato da un altro programma.Come impedire a grep di stampare una nuova riga finale?

Tuttavia, quel programma si aspetta che l'output sia numerico o zero byte.

Ora grep emette un carattere di fine riga dopo l'uscita. Ho controllato l'opzione -Z ma non sembra funzionare come sto usando grep per il conteggio (-c).

Sto eseguendo in sh, non bash. Quindi nidificare in echo -n "$(grep -c pattern)" non funziona.

Come posso sbarazzarmi della linea di partenza finale?

risposta

14

È possibile collegarlo a TR e tradurre il carattere \ n in un carattere \ 0.

+0

questo ha funzionato! Grazie! Accetterà quando mi consentirà: P –

18

Usa tr -d per eliminare i caratteri di una stringa:

sh-3.2$ grep -c ' ' /etc/passwd | tr -d '\n' 
69sh-3.2$ grep -c ' ' /etc/passwd | tr -d '\n' | xxd 
0000000: 3639          69 
sh-3.2$ 
+0

Senza tr gdb mostra '4 \ nj \ 000 \ 000', con tr mostra' 4 \ 346j \ 000 \ 000' come valore di ciò che viene restituito dalla riga di comando. 4 è il numero contato che voglio. –

+0

Sei sicuro che 'grep' sta producendo quei caratteri dopo il numero? – Johnsyweb

8

So che questo è vecchio, e TR funziona altrettanto bene, ma mi è capitato tra questa domanda e ho notato OP ha dichiarato: sto eseguendo in sh, non bash. Quindi nidificare in echo -n "$ (grep -c pattern)" non funziona neanche.

Questo non è grep o sh quanto il modo in cui viene utilizzato l'eco. Per i visitatori futuri, l'unica ragione per cui questo non ha funzionato è dovuta alle doppie virgolette attorno al comando sostituito. Quanto segue, in effetti, funziona anche usando sh.

echo -n $(grep -c pattern) 

Esempi:

$ ls /dev/sd? #example of formatted output 
/dev/sda /dev/sdc /dev/sde /dev/sdg /dev/sdi /dev/sdk 
/dev/sdb /dev/sdd /dev/sdf /dev/sdh /dev/sdj 

$ echo $(ls /dev/sd?) #without -n, appends \n only at the end 
/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk 

$ echo -n $(ls /dev/sd?) #with -n, does not append the \n, but still strips the line breaks from the string 
/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk 

$ echo -n "$(ls /dev/sd?)" #output when double quotes are used 
/dev/sda 
/dev/sdb 
/dev/sdc 
/dev/sdd 
/dev/sde 
/dev/sdf 
/dev/sdg 
/dev/sdh 
/dev/sdi 
/dev/sdj 
/dev/sdk 
Problemi correlati