2013-02-12 11 views
9

Mam wykonywane polecenia w bash pobrać kilka adresów z pliku jak poniżej:Bash, jak dodać słowo do końca wiersza?

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

Wynik:

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

i chciałbym dołączyć „eth0” do każdej z tych linii wyjściowych a następnie idealnie dla pętli nad wynikiem, aby wywołać polecenie z każdą linią. Problemem jest uzyskanie tego dodatkowego ciągu na końcu każdej linii. Próbowałem:

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

które nie work..and następnie zakładając mam go tam, jeśli mogę zawinąć go w pętli for to nie przejdzie w pełnych linii, ponieważ zawierają one spacje. Więc jak mam to zrobić?

+0

Jak wygląda plik wejściowy? –

Odpowiedz

16

można dopasować $ dołączyć do linii, jak:

sed -e 's/$/ eth0/' 

EDIT:

Do pętli nad wierszami, bym zasugerować używając while pętlę, jak:

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

Cool, i jak mogę pętli nad wynikami na końcu? Odstęp powoduje, że przechodzę przez każde słowo, a nie przez każdą linię! –

+1

'Bash',' grep', 'cut',' tr' i 'sed' no no no ... To, czego chcesz, możesz osiągnąć za pomocą samego' sed' lub 'awk'. –

+0

@sudo_O Podczas gdy podzielam twoje uczucia w pewnym stopniu, to naprawdę nie jest takie złe: P. To w linii unixów łączy się mnóstwo małych narzędzi, dlatego istnieją. – FatalError

0

jest w porządku dla Ciebie?

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 można scalić swoją cięcie, tr (nawet grep w przykładzie) w jednym sed/awk wezwanie, aby CmdLine prostsze i szybsze.

8

Jak około tuż za pomocą 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 

Albo po prostu z sed:

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

To jest dobre, muszę przejrzeć mój sed/awk –

2

Wszystko czego potrzebujesz to:

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 

Zawsze używaj IFS = i -r podczas używania czytać, chyba że masz do tego konkretny powód. google z tego powodu.

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