web-dev-qa-db-fra.com

Bash comment ajouter Word pour fin d'une ligne?

J'ai exécuté une commande dans bash pour récupérer des adresses d'un fichier comme celui-ci:

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

rendements:

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

et je voudrais ajouter 'eth0' à chacune de ces lignes de sortie et idéalement pour que la boucle sur le résultat appelle une commande avec chaque ligne. Le problème que j'ai est d'obtenir cette chaîne supplémentaire à la fin de chaque ligne. J'ai essayé:

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

ce qui n'a pas fonctionné..et puis supposons que je l'ai eu là, si je l'enveloppe dans une boucle for il ne passera pas dans les lignes complètes car ils contiennent des espaces. Alors, comment vais-je à ce sujet?

9
Palace Chan

Vous pouvez associer $ à ajouter à une ligne, par exemple:

sed -e 's/$/ eth0/'

MODIFIER:

Pour passer en boucle sur les lignes, je suggérerais d'utiliser une boucle while, comme:

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

Pourquoi ne pas utiliser awk:

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

Démo:

$ 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

Ou simplement avec 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

Tout ce dont tu as besoin c'est:

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

Utilisez toujours IFS = et -r lorsque vous utilisez read, sauf si vous avez une raison très spécifique de ne pas le faire. google pour pourquoi.

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

c'est bon pour toi?

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, vous pouvez fusionner votre coupe, tr (même grep dans votre exemple) en un seul appel sed/awk, pour rendre la cmdline plus simple et plus rapide.

0
Kent