it-swarm.com.de

Bash, wie man Word an das Ende einer Zeile anfügt?

Ich habe einen Befehl in Bash ausgeführt, um einige Adressen aus einer Datei wie dieser abzurufen:

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

ergibt:

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

und ich möchte 'eth0' an jede dieser Ausgabezeilen anhängen und dann idealerweise eine Schleife über das Ergebnis erstellen, um mit jeder Zeile einen Befehl aufzurufen. Das Problem, das ich habe, ist die zusätzliche Zeichenfolge am Ende jeder Zeile. Ich habe es versucht:

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

das hat nicht funktioniert. Und wenn ich es dann dort habe, wird es nicht in den vollständigen Zeilen übergeben, da sie Leerzeichen enthalten, wenn ich es in eine for-Schleife einbinde. Wie gehe ich vor?

9
Palace Chan

Sie können $ anpassen, um an eine Zeile angehängt zu werden, z.

sed -e 's/$/ eth0/'

BEARBEITEN:

Um die Zeilen zu durchlaufen, würde ich vorschlagen, eine while-Schleife zu verwenden, wie:

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

Wie wäre es mit 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

Oder einfach mit sed:

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

Alles was Sie brauchen ist:

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

Verwenden Sie immer IFS = und -r, wenn Sie read verwenden, es sei denn, Sie haben einen bestimmten Grund. Google für warum.

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

passt das für dich?

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. Sie könnten Ihren Schnitt, tr (sogar grep in Ihrem Beispiel) in einem sed/awk-Aufruf zusammenführen, um die cmdline einfacher und schneller zu machen.

0
Kent

Ich bin hierher gekommen, um nach der gleichen Antwort zu suchen, aber keine der oben genannten Antworten macht es so sauber wie

sed -i 's/address=.*/& eth0/g' file

Suche und ersetze inline mit sed nach Zeilen, die mit address beginnen, ersetze mit derselben Zeile plus 'eth0'

z.B.

sed -i 's/address=.*/& eth0/g' file; cat file
junk line
address=192.168.0.12:80 eth0
address=127.0.0.1:25 eth0
don not match this line
0
Calvin Taylor