2013-04-19 4 views
1

J'ai plusieurs adresses ip dans une variable.Newlines en sauvegardant une variable dans un fichier - bash

ActiveIPs=192.168.0.1 192.168.0.2 192.168.0.3 

Je veux les enregistrer dans un fichier comme celui-ci par une nouvelle ligne seperated

192.168.0.1 
192.168.0.2 
192.168.0.3 

comment puis-je faire cela?

+2

Il doit y avoir une faute de frappe. Il n'y a aucun moyen que le premier caractère de cette expansion puisse être un espace à moins que vous ne l'enveloppiez entre guillemets. – kojiro

+0

votre droit, thanx – user2266492

+2

Vous devez toujours * citer * la chaîne entière; sinon, tout ce qui provient du second jeton est interprété comme une * commande * (au moins dans bash 3.2.48). – mklement0

Répondre

0

Peut-être trop basique, mais cela fonctionne:

echo "ActiveIPs= 192.168.0.1 192.168.0.2 192.168.0.3" | cut -d= -f2 | awk '{for (i=1;i<=NF;i++) print $i}' 

Sortie:

192.168.0.1                                                                  
192.168.0.2                                                                  
192.168.0.3 

Pour tout le monde: est-il une meilleure façon d'imprimer une nouvelle ligne entre chaque champ awk? Essayé avec OFS='\n' mais n'a pas fonctionné.

+0

Pour répondre à votre question 'echo" ActiveIPs = 192.168.0.1 192.168.0.2 192.168.0.3 "| awk 'NR> 1' RS = '' 'Cependant, je ne pense pas que' ActiveIPs' contient du texte, c'est le nom de la variable voir ma réponse. –

+0

Oh, je ne connaissais pas 'RS'. Je pensais que son but était fait par 'OF' (quelle est leur différence?). Aussi: maintenant je vois votre point sur 'ActiveIPs = ...', je pensais que c'était une chaîne entière. +1 pour votre réponse, @sudo_O. – fedorqui

+0

Un champ est constitué d'enregistrements, un enregistrement est constitué de champs, 'awk' itère sur les enregistrements (par défaut, un enregistrement est un retour à la ligne). En définissant ce que les enregistrements sont 'awk', vous ferez l'itération pour que vous n'ayez pas à le faire. Pour comprendre pourquoi la définition de 'OFS' n'a pas fonctionné pour votre lecture http://backreference.org/2010/02/10/idiomatic-awk/ spécialement la section d'auto-affectation. –

1

printf répétera un motif si nécessaire.

ActiveIPs="192.168.0.1 192.168.0.2 192.168.0.3" 
printf "%s\n" $ActiveIPs > file.txt 
+1

Je donne +1 à toutes les réponses qui n'impliquent pas de pipelines ou de commandes externes. – kojiro

+0

C'est une excellente solution pour la valeur d'entrée spécifique, mais elle est délicate pour une utilisation générale: la solution repose sur la valeur à être soumise à * expansion * par le shell, ce qui peut avoir des effets secondaires indésirables. – mklement0

0

Remarque - Immédiatement après le \ coup NEWLINE-:

echo $ActiveIPs | sed 's/ /\ 
/g' 
+2

Voici une version d'une seule ligne utilisant le littéral '$ '\ n'':' echo $ ActiveIPs | sed 's// \' $ '\ n' '/ g'' – mklement0

1
for ip in $ActiveIPs; do 
    echo $ip >> file 
done 
+0

+1 Façon d'éviter les commandes externes et les tuyaux! – kojiro

+3

(Bien qu'il soit plus efficace de mettre simplement '> file' à la fin de la boucle pour l'écrire une fois plutôt que d'ajouter chaque ligne séparément.) – kojiro

1

Utilisez une extension de paramètre pour modifier tous les caractères de l'espace pour les nouvelles lignes:

$ foo='abc def ghi' 
$ echo "${foo// /$'\n'}" 
abc 
def 
ghi 

Utilisation d'une extension des paramètres évite de créer un nouveau processus, pas même une commande intégrée.

Si vous le pouvez, vous feriez mieux de sauvegarder les valeurs dans un tableau:

$ input=(192.168.0.100 10.0.0.1 192.168.0.101) 

De cette façon, vous avez un contrôle complet sur la façon dont le shell sépare les mots, et vous n'avez pas encore invoquer une commande externe.

$ SAVE_IFS="$IFS" 
$ IFS=$'\n' 
$ echo "${input[*]}" 
192.168.0.100 
10.0.0.1 
192.168.0.101 
2
$ ActiveIPs="192.168.0.1 192.168.0.2 192.168.0.3" 

$ awk '1' RS=' ' <<< "$ActiveIPs" 
192.168.0.1 
192.168.0.2 
192.168.0.3 
+0

Nice; la technique RS (Input Record Separator) est bonne à savoir. Une mise en garde: avec '<<<' vous obtiendrez un \ n de fin supplémentaire dans la sortie; pour éviter cela, utilisez 'printf" $ ActiveIPs "| awk '1' RS = '' '. – mklement0

Questions connexes