我有几个地点需要每天检查 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,使用 GNUsed
和bash
/ 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]