shell入门学习笔记-15-命令详解: 三剑客之一awk-分支语句、数组

版权声明:本文为博主hanchao5272原创文章,转载请注明来源,并留下原文链接地址,谢谢! https://blog.csdn.net/hanchao5272/article/details/88787583

系列目录与参考文献传送门: shell入门学习笔记-序章

awk分支控制

if

admindeMacBook-Pro:~ admin$ seq 5 |awk '{if($0%2) print $0}'
1
3
5
admindeMacBook-Pro:~ admin$ seq 5 |awk '{if($0%2) print $0; else print "--"}'
1
--
3
--
5
admindeMacBook-Pro:~ admin$ seq 5 |awk '{if($0%2==0) print $0"(%2)"; else if($0%3==0) print $0"(%3)"; else print "--"}'
--
2(%2)
3(%3)
4(%2)
--

while

admindeMacBook-Pro:~ admin$ echo "1 2 3 4" | awk '{i=1;while(i<=3){print $i^2;i++}}'
1
4
9

for

# 遍历所有字段
admindeMacBook-Pro:~ admin$ printf "1 2 3\n4 5 6\n7 8 9\n" |awk '{for(i=1;i<=NF;i++) printf $i" "}END{print ""}'
1 2 3 4 5 6 7 8 9 7 8 9
# 倒序遍历
admindeMacBook-Pro:~ admin$ printf "1 2 3\n4 5 6\n7 8 9\n" |awk '{for(i=NF;i>=1;i--) printf $i" "}END{print ""}'
3 2 1 6 5 4 9 8 7
# 每行单独换行
admindeMacBook-Pro:~ admin$ printf "1 2 3\n4 5 6\n7 8 9\n" |awk '{for(i=NF;i>=1;i--) {printf $i" "} print ""}'
3 2 1
6 5 4
9 8 7
# 忽略第1列
admindeMacBook-Pro:~ admin$ printf "1 2 3\n4 5 6\n7 8 9\n" |awk '{for(i=NF;i>=2;i--) {printf $i" "} print ""}'
3 2
6 5
9 8

IP加单引号

admindeMacBook-Pro:~ admin$ echo "10.10.10.10 20.20.20.20 30.30.30.30" |awk '{for(i=1;i<=NF;i++){printf "\047"$i"\047 "} print ""}'
'10.10.10.10' '20.20.20.20' '30.30.30.30'

showkey -a可以显示输入字符的ASCLL编码:

admindeMacBook-Pro:~ admin$ showkey -a

按任意键 - Ctrl-D 将结束这个程序

1 	 49 0061 0x31
a 	 97 0141 0x61
' 	 39 0047 0x27
^D 	  4 0004 0x04

for遍历数组

admindeMacBook-Pro:~ admin$ awk 'BEGIN{a[0]=1;a[1]=2;a[2]=3;for(i in a) print i}'
0
1
2

break和continue

admindeMacBook-Pro:~ admin$ echo "1 3 5" |awk '{for(i=1;i<=NF;i++){if($i==3){break};print $i}}'
1
admindeMacBook-Pro:~ admin$ echo "1 3 5" |awk '{for(i=1;i<=NF;i++){if($i==3){continue};print $i}}'
1
5
  • break跳出本层循环
  • continue跳出本次循环

exit

# break的执行结果
admindeMacBook-Pro:~ admin$ echo "1 3 5" |awk '{for(i=1;i<=NF;i++){if($i==3){break};print $i}}'
1
admindeMacBook-Pro:~ admin$ echo $?
0
# continue的执行结果
admindeMacBook-Pro:~ admin$ echo "1 3 5" |awk '{for(i=1;i<=NF;i++){if($i==3){continue};print $i}}'
1
5
admindeMacBook-Pro:~ admin$ echo $?
0
# exit(111)的执行结果
admindeMacBook-Pro:~ admin$ echo "1 3 5" |awk '{for(i=1;i<=NF;i++){if($i==3){exit(111)};print $i}}'
1
admindeMacBook-Pro:~ admin$ echo $?
111
# exit(-1)的执行结果
admindeMacBook-Pro:~ admin$ echo "1 3 5" |awk '{for(i=1;i<=NF;i++){if($i==3){exit(-1)};print $i}}'
1
admindeMacBook-Pro:~ admin$ echo $?
255
  • exit的执行结果取值范围:0~255

delete删除数组或元素

admindeMacBook-Pro:~ admin$ awk 'BEGIN{a[0]=1;a[1]=2;a[2]=3;for(i in a) print i}'
0
1
2
# delete array 删除数组
admindeMacBook-Pro:~ admin$ awk 'BEGIN{a[0]=1;a[1]=2;a[2]=3;delete a;for(i in a) print i}'
# delete array[i] 删除数组元素
admindeMacBook-Pro:~ admin$ awk 'BEGIN{a[0]=1;a[1]=2;a[2]=3;delete a[1];for(i in a) print i}'
0
2

awk数组

  • awk中数组称为关联数组,不仅可以使用数字作为下标,还可以使用字符串作为下标。
  • 数组元素的键和值存储在awk程序内部的一个表中,该表采用散列算法,因此数组元素是随机排序

下标从哪里开始由你决定

admindeMacBook-Pro:~ admin$ echo "1 3 5" |awk '{for(i=1;i<=NF;i++) a[i^2]=$i;print a[1],a[9]}'
1 5

下标是什么由你决定

admindeMacBook-Pro:~ admin$ awk 'BEGIN{a["x"]=22;a["y"]=11;for(v in a) print "a["v"]="a[v]}'
a[x]=22
a[y]=11
admindeMacBook-Pro:~ admin$ awk 'BEGIN{a["x"]=22;a[y]=11;for(v in a) print "a["v"]="a[v]}'
a[]=11
a[x]=22
  • 注意以字符串作为数组下标时,需要注意双引号

###随机排序

admindeMacBook-Pro:~ admin$ echo "1 3 5" |awk '{for(i=1;i<=NF;i++) a[i^2]=$i;for(v in a) print "a["v"]="a[v]}'
a[4]=3
a[9]=5
a[1]=1

统计行数

# 统计日志中各种级别的消息的出现次数
admindeMacBook-Pro:~ admin$ cat log.txt |awk '{arr[$1]++}END{for(v in arr) print v,arr[v]}'
WARNING 1
ERROR 2
INFO 3
# 另外的实现方式
admindeMacBook-Pro:~ admin$ cat log.txt |awk '{print $1 |"sort |uniq -c"}'
      2 ERROR
      3 INFO
      1 WARNING
# 管道后追加的命令必须放在双引号中
admindeMacBook-Pro:~ admin$ cat log.txt |awk '{print $1 |sort |uniq -c}'
awk: cmd. line:1: {print $1 |sort |uniq -c}
awk: cmd. line:1:                  ^ syntax error
# 管道后追加的命令必须放在双引号中,且同一个双引号中
admindeMacBook-Pro:~ admin$ cat log.txt |awk '{print $1 |"sort" |"uniq -c"}'
awk: cmd. line:1: {print $1 |"sort" |"uniq -c"}
awk: cmd. line:1:                    ^ syntax error
  • 注意:在awk中通过|管道追加命令时,需要将命令放在双引号中,否则报错

去重与取冲

admindeMacBook-Pro:~ admin$ printf "111\n222\n111\n333\n444\n222\n"
111
222
111
333
444
222
# 取重
admindeMacBook-Pro:~ admin$ printf "111\n222\n111\n333\n444\n222\n" |awk 'a[$0]++'
111
222
# 去重
admindeMacBook-Pro:~ admin$ printf "111\n222\n111\n333\n444\n222\n" |awk '!a[$0]++'
111
222
333
444

模拟二维数组

admindeMacBook-Pro:~ admin$ awk 'BEGIN{a["1,1"]=1;a["1,2"]=2;a["2,1"]=2;a["2,2"]=4;for(v in a){print "a["v"]="a[v]}}'
a[1,1]=1
a[1,2]=2
a[2,1]=2
a[2,2]=4

猜你喜欢

转载自blog.csdn.net/hanchao5272/article/details/88787583