2010-10-30 6 views
3

Je suis un débutant dans l'utilisation de Linux, j'ai un fichier d'entrée avec un contenu comme:Linux commande awk

00.11.11.11.11.11 
177.22.22.22 

une ligne d'adresse Ethernet et une ligne d'adresse IP, comment puis-je convertir ce fichier :

IP: 177.22.22.22 MAC: 00.11.11.11.11.11 

Je pense que awk le ferait, mais je ne sais pas comment. Des idées?

Merci!

Répondre

3

Cela pourrait être fait avec 'sed' aussi, mais puisque vous demandez 'awk', 'awk' ça doit être.

awk '/^([0-9]+\.){5}[0-9]+$/ { mac = $1 } 
    /^([0-9]+\.){3}[0-9]+$/ { printf "IP: %s MAC: %s\n", $1, mac }' data 

(la version précédente:

awk '/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ { mac = $1 } 
    /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ { printf "IP: %s MAC: %s\n", $1, mac }' 

pas si bon à cause de la répétition écrite sur, au lieu de répétition compté.)

La première correspond à la ligne des adresses MAC et enregistre les le plus récent en variable mac. La seconde correspond aux adresses IP (IPv4) et imprime l'adresse MAC et l'adresse IP actuelles.

Si vous avez des blancs de début ou de fin, ou d'autres caractères parasites, vous devez rendre les expressions régulières plus compliquées.

+0

Aïe @ Jason, peut-être vous pouvez mettre l'adresse IP et MAC sur la même ligne avec un espace entre et 'cat fichier | awk '{print" IP: ", $ 1," MAC: ", $ 2}' 'pour obtenir le même résultat – greg

+0

Cela fonctionne très bien , th merci beaucoup! – Jason

+0

Notez que cela ignore les lignes vides ou les lignes qui ne correspondent pas exactement à 4 ou 6 chiffres décimaux - ce qui peut être ou ne pas être une vertu. La même adresse MAC pourrait être utilisée pour un certain nombre d'adresses IP, par exemple, si les données n'étaient pas strictement des lignes alternantes. Les autres solutions qui ne scrutent pas les données d'entrée sont susceptibles de se désynchroniser avec les données - si les données sont mal formées. –

3

Vous pouvez try it at ideone:

vraiment court!

{mac=$0; 
getline ip; 
print "IP: " ip " MAC: " mac} 
+0

très bien, merci! – Jason

3

paste - - < input_file | awk '{print "IP: " $2 " MAC: " $1}'

+0

Pardonne mon ignorance ... Est-ce que "coller - -" tourne toutes les deux lignes en une seule? –

+0

pâte transforme son entrée en colonnes, le nombre de colonnes est le '- -' –

+0

nice! +1 // 7 caractères supplémentaires pour aller –

1
{ if(mac) { print "IP:", $0, "MAC:", mac; mac = 0 } else mac = $0 } 
2

awk -vRS = '{print "IP:", $ 2, "MAC:", $ 1;}'

qui équivaut à

awk 'BEGIN {RS = "";} {print "IP:", $ 2, "MAC:", $ 1;}'

Ceci fonctionne également avec plusieurs entrées:
"
00.11.22.33.44.55
123.45.67.89

11.22.33.44.55.66
11.22.33.99
"

->

"
IP: 123.45.67.89 MAC: 00.11.22.33.44.55
IP: 11.22.33.99 MAC: 11.22.33.44.55.66
"

+0

Cela nécessite des lignes vides séparant les paires de lignes de données. –

1

est ici une version sed pour la variété:

sed 's/^/MAC: /;x;N;s/\n/IP: /;G;s/\n/ /' inputfile 

S'il y a plus d'une paire de lignes dans le fichier:

sed 's/^/MAC: /;x;s/.*//;N;s/\n/IP: /;G;s/\n/ /' inputfile 
1
awk -F"." 'NF>4{m=$0}NF==4{print "IP:"$0" MAC:"m}' file