Reorganiza el file para que sea fácil de leer

Tengo algunas ubicaciones que necesitan que se compruebe el WiFi diariamente. Actualmente, cuando ejecuto mi script, este es el resultado que obtengo.

El primer nombre corresponde al primer MAC, el primer IP y así sucesivamente. ¿Cómo puedo reorganizar este file con grep , awk o sed ?

 Name : WiFi 1 Name : WiFi 2 Name : WiFi 3 Name : WiFi 4 Name : WiFi 5 Name : WiFi 6 Name : WiFi 7 MAC : aa:aa:aa:aa:aa:aa MAC : bb:bb:bb:bb:bb:bb MAC : cc:cc:cc:cc:cc:cc MAC : dd:dd:dd:dd:dd:dd MAC : ee:ee:ee:ee:ee:ee MAC : ff:ff:ff:ff:ff:ff MAC : gg:gg:gg:gg:gg:gg IP : 10.0.1.0 IP : 10.0.1.1 IP : 10.0.1.2 IP : 10.0.1.3 IP : 10.0.1.4 IP : 10.0.1.5 IP : 10.0.1.6 Status : Operational Status : Operational Status : Operational Status : Operational Status : Operational Status : Operational Status : Operational Interface : X2 Interface : X2 Interface : X2 Interface : X2 Interface : X2 Interface : X2 Interface : X2 

Me gustaría que todos ellos salgan como se muestra a continuación

 Name : WiFi 1 MAC : aa:aa:aa:aa:aa:aa IP : 10.0.1.0 Status : Operational Interface : X2 

Versión de autoconteo, temporada al gusto:

 awk ' $1!=last {n=0;last=$1} {++n;gaggle[n]=gaggle[n]"\n"$0} END { for (k in gaggle) print gaggle[k] } ' 

Para siete AP, con GNU sed y bash / ksh :

 for (( i = 1; i <= 7; ++i )); do sed -n "$i~7p" data echo done 

Con la información proporcionada en los data , este performance

 Name : WiFi 1 MAC : aa:aa:aa:aa:aa:aa IP : 10.0.1.0 Status : Operational Interface : X2 Name : WiFi 2 MAC : bb:bb:bb:bb:bb:bb IP : 10.0.1.1 Status : Operational Interface : X2 Name : WiFi 3 MAC : cc:cc:cc:cc:cc:cc IP : 10.0.1.2 Status : Operational Interface : X2 

(etc.)

Si no sabemos cuántos puntos de acceso existen, cuente las líneas de Name :

 num="$( grep -c '^Name' data )" for (( i = 1; i <= num; ++i )); do sed -n "$i~${num}p" data echo done 

El first~step syntax del range específico de sed GNU

Haga coincidir la línea de cada step con la línea first .

de acuerdo con el manual de GNU sed .

Otra forma más:

 num=$(grep -c ^Name inputfile) for((i=1; i <= num; i++)); do for((j=1; j < num- 1; j++)); do printf "%dp;" $((i + (j-1)*num)); done; printf "\n"; done | while read cmd; do sed -n "$cmd" inputfile; done 

Otro enfoque, sin awk o sed , causa por qué no:

 split -a 1 -l 7 inputfile && paste -d '\n' x{a,b,c,d,e} 

Aquí hay otro enfoque en awk .

 awk '{a[(NR-1)%7]=a[(NR-1)%7]$0RS}END{for(;i<7;){print a[i++]}}' Name : WiFi 1 MAC : aa:aa:aa:aa:aa:aa IP : 10.0.1.0 Status : Operational Interface : X2 Name : WiFi 2 MAC : bb:bb:bb:bb:bb:bb IP : 10.0.1.1 Status : Operational Interface : X2 [etc] 

Este script hará el trabajo, si entiendo los requisitos correctamente:

 #!/usr/bin/zsh grep Name $1 > /tmp/wifinames grep MAC $1 > /tmp/wifiMAC # ... # add lines for other fields here, you can store the names of files # in an array like ['file1', file2',..], and run a for loop printing the nth line inside the # while loop below i=1 n=`wc -l /tmp/wifinames|awk '{print $1}'` # maybe you should run some tests to check if all the files # produced by grep have equal number of entries while [[ $i -le $n ]]; do # prints nth line sed "${i}q;d" /tmp/wifinames sed "${i}q;d" /tmp/wifiMAC # ... (( i = $i + 1 )) done