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)
Kus*_*nda 10
对于七个 AP,使用 GNUsed和bash/ 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手册。
还有一种方式:
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)
另一种方法,没有awk或sed,导致为什么不:
split -a 1 -l 7 inputfile && paste -d '\n' x{a,b,c,d,e}
Run Code Online (Sandbox Code Playgroud)
这是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)