2013-02-12 7 views
9

Ho eseguito un comando in bash per recuperare alcuni indirizzi da un file in questo modo:Bash come aggiungere la parola alla fine di una riga?

grep address file.txt | cut -d'=' -f2 | tr ':' ' ' 

rendimenti:

xxx.xx.xx.xxx port1 
xxx.xx.xx.xxx port2 

e vorrei aggiungere 'eth0' per ciascuna di queste linee di uscita e quindi idealmente per ripetere il ciclo sul risultato per chiamare un comando con ogni linea. Il problema che sto avendo è ottenere quella stringa in più alla fine di ogni riga. Ho provato:

| sed -e 's/\(.+)\n/\1 eth0/g' 

che non work..and poi supponendo sono arrivato lì, se mi avvolgo in un ciclo for non passerà nelle linee complete in quanto contengono spazi. Quindi, come faccio a fare questo?

+0

come si presenta il file di input? –

risposta

16

È possibile abbinare $ da aggiungere a una linea, come:

sed -e 's/$/ eth0/' 

EDIT:

Per eseguire un ciclo sopra le righe, mi piacerebbe suggerire utilizzando un ciclo while, come:

while read line 
do 
    # Do your thing with $line 
done < <(grep address file.txt | cut -d'=' -f2 | tr ':' ' ' | sed -e 's/$/ eth0') 
+0

Cool, e come faccio a scorrere i risultati alla fine? La spaziatura mi fa scorrere su ogni parola e non su ogni linea! –

+1

'Bash',' grep', 'cut',' tr' e 'sed' no no no ... Quello che vuoi può essere ottenuto con' sed' o 'awk' da solo. –

+0

@sudo_O Mentre condivido il tuo sentimento in una certa misura, questo non è poi così male: P. È nella linea di sangue di Unix mettere insieme una tonnellata di piccole utility come questa, ecco perché esistono. – FatalError

0

questo è giusto per te?

kent$ echo "xxx.xx.xx.xxx port1 
xxx.xx.xx.xxx port2"|sed 's/.*/& eth0/' 
xxx.xx.xx.xxx port1 eth0 
xxx.xx.xx.xxx port2 eth0 

P.S è possibile unire il vostro taglio, TR (anche grep nel tuo esempio) in una chiamata sed/awk, per rendere il cmdline più semplice e veloce.

8

ne dite di semplicemente utilizzando awk:

awk -F= '/address/{gsub(/:/," ");print $2,"eth0"}' file 

Demo:

$ cat file 
junk line 
address=192.168.0.12:80 
address=127.0.0.1:25 
don not match this line 

$ awk -F= '/address/{gsub(/:/," ");print $2,"eth0"}' file 
192.168.0.12 80 eth0 
127.0.0.1 25 eth0 

O solo con sed:

$ sed -n '/address/{s/:/ /g;s/.*=//;s/$/ eth0/p}' file 
192.168.0.12 80 eth0 
127.0.0.1 80 eth0 
+0

Questo è buono, ho bisogno di rivedere il mio sed/awk –

2

Tutto ciò che serve è:

awk -F'[=:]' '{print $2, $3, "eth0"}' file.txt | 
while IFS= read -r ip port eth 
do 
    printf "ip=%s, port=%s, eth=%s\n" "$ip" "$port" "$eth" 
done 

uso sempre IFS = e -r quando si utilizza la lettura a meno che non si abbia una ragione molto specifica per non farlo. google per il perché.

0
typeset TMP_FILE=$(mktemp) 
touch "${TMP_FILE}" 
cp -p filename "${TMP_FILE}" 
sed -e 's/$/stringToAdd/' "${TMP_FILE}" > filename