重新排列文件,使其易于阅读

重新排列文件,使其易于阅读

我有几个地点需要每天检查 WiFi。目前,当我运行脚本时,这就是我得到的结果。

第一个名称对应于第一个 MAC、第一个 IP 等等。我怎样才能用grep,awk或重新排列这个文件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

我希望它们全部输出如下所示

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

答案1

自计数版本,按季节品尝:

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

答案2

对于七个 AP,使用 GNUsedbash/ ksh

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

根据 中提供的信息data,得出

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。)

如果我们不知道有多少个 AP,请计算行Name数:

num="$( grep -c '^Name' data )"

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

GNUsed特定的范围语法first~step

匹配step以 line 开头的每一行first

根据 GNUsed手册。

答案3

还有另一种方式:

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

答案4

这是 中的另一种方法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]

相关内容