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?
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')
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
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.
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/stringToAdd/' "${TMP_FILE}" > filename
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.