-15- command shell entry study notes explain: One of the Three Musketeers awk- branch statement, arrays

Disclaimer: This article is a blogger hanchao5272 original articles, please indicate the source and leave the original link address, thank you! https://blog.csdn.net/hanchao5272/article/details/88787583

Series catalog References Portal: shell introductory study notes - Prologue

awk branch control

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 single quotation marks

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 -aYou can display the input character ASCLLencoding:

admindeMacBook-Pro:~ admin$ showkey -a

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

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

for loop through the array

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
  • breakThis layer out of cycle
  • continueOut of this cycle

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
  • exitThe results of the implementation of the range:0~255

delete or delete array element

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 array

  • awk the array is called 关联数组, can be used not only 数字as a subscript, may also be used 字符串as a subscript.
  • Keys and values stored in the array element awk program inside a table, the table adopts 散列算法, so the array element is 随机排序.

Subscript begin to decide where to you

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

Subscript is determined by what you

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
  • Note to 字符串an array subscript as the need to pay attention 双引号.

### randomly ordered

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

Count the number of rows

# 统计日志中各种级别的消息的出现次数
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
  • Note: awkby |the time additional pipeline command, the command needs to be enclosed in double quotes, otherwise an error

And to re-take the punch

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

Analog two-dimensional array

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

Guess you like

Origin blog.csdn.net/hanchao5272/article/details/88787583