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

amp*_*mos 4 grep sed awk text-formatting

我有几个地方需要每天检查 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
Run Code Online (Sandbox Code Playgroud)

我希望它们都输出如下所示

Name                : WiFi 1
MAC                 : aa:aa:aa:aa:aa:aa
IP                  : 10.0.1.0
Status              : Operational
Interface           : X2
Run Code Online (Sandbox Code Playgroud)

jth*_*ill 13

自算版,应季品尝:

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

  • awk 不保证 `in` 结果的顺序,如果重要你可以 `for (k=1;k<=n;++k)` 或以其他方式跟踪计数。 (3认同)

Kus*_*nda 10

对于七个 AP,使用 GNUsedbash/ ksh

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

使用 中提供的信息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
Run Code Online (Sandbox Code Playgroud)

(等等。)

如果我们不知道有多少个 AP,数一下这些Name行:

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

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

sed特定于GNU 的范围语法first~step

匹配以stepline 开头的每一行first

根据GNUsed手册。


Jef*_*ler 6

还有一种方式:

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
Run Code Online (Sandbox Code Playgroud)


gar*_*ead 6

另一种方法,没有awksed,导致为什么不:

split -a 1 -l 7 inputfile && paste -d '\n' x{a,b,c,d,e}
Run Code Online (Sandbox Code Playgroud)


ste*_*eve 5

这是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]
Run Code Online (Sandbox Code Playgroud)