awk终于能入门了,所以整理了该文章,内容大多来自网上。

一、bash支持一维数组(不支持多维数组),没有限定数组的大小。在shell中,用括号来表示数组,数组元素用空格符号分割开。类似于C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0

1. 定义数组

数组名array,元素a b c

[root@localhost~]# array=(a b c)

2.获取所有元素

[root@localhost~]# echo ${array[*]}

a b c

[root@localhost~]# echo ${array[@]}

a b c

3.获取数组的长度

[root@localhost~]# echo ${#array[*]}

3

4.通过下标0 1 2依次获取数组的每一个元素

[root@localhost~]# echo ${array[0]}

a

[root@localhost~]# echo ${array[1]}

b

[root@localhost~]# echo ${array[2]}

c

5.获取部分数组

[root@localhost~]# echo ${array[*]:0:2}

a b

6.删除第一个元素

[root@localhost~]# unset array[0]

7.删除整个数组

[root@localhost~]# unset array

小例子:#!/bin/bash

#删除指定目录下的文件

a=(/usr/local/tomcat/logs /home/user/tomcat/logs /usr/local/app/tomcat/logs)

for i in "${a[@]}"

do

find "$i" -maxdepth 1 -type f -name "*.txt"  ! -name "*.*" ! -mtime +30 -exec rm {} \;

done

二、awk数组

awk的数组,一种关联数组(Associative Arrays),支持多维数组,下标可以是数字和字符串。因无需对数组名和元素提前声明,也无需指定元素个数 ,所以awk的数组使用非常灵活。

1.建立数组array[index]=value 数组名array,下标index以及相应的值value

2.读取数组值{for (item in array)  print array[item]} # 输出的顺序是随机的

{for(i=1;i<=len;i++)  print array[i]}    # len 是数组的长度

3.多维数组,array[index1,index2,……]:SUBSEP是数组下标分割符。可以事先设定SUBSEP,也可以直接在SUBSEP的位置输入你要用的分隔符,如:[root@localhost~]# awk 'BEGIN{array["a","b"]=1;for(i in array) print i}'

a b

[root@localhost~]# awk 'BEGIN{SUBSEP=":";array["a","b"]=1;for(i in array) print i}'

a:b

[root@localhost~]# awk 'BEGIN{array["a"":""b"]=1;for(i in array) print i}'

a:b[root@localhost~]# cat file

A 192.168.1.1 HTTP

B 192.168.1.2 HTTP

B 192.168.1.2 MYSQL

C 192.168.1.1 MYSQL

C 192.168.1.1 MQ

D 192.168.1.4 NGINX

[root@localhost~]# awk '{a[$1"-"$2]++}END{for(i in a)print a[i],i}' file

[root@localhost~]# awk '{SUBSEP="-"}{a[$1,$2]++}END{for(i in a) print a[i],i}' file

2 B-192.168.1.2

1 D-192.168.1.4

2 C-192.168.1.1

1 A-192.168.1.1

[root@localhost~]# awk '{$1="";a[$2]=a[$2]FS$3}END{for(i in a)print i,a[i]}' file

192.168.1.4  NGINX

192.168.1.1  HTTP MYSQL MQ

192.168.1.2  HTTP MYSQL

[root@localhost~]# awk '{$1="";a[$2]=a[$2]";"$3}END{for(i in a)print i a[i]}' file

192.168.1.4;NGINX

192.168.1.1;HTTP;MYSQL;MQ

192.168.1.2;HTTP;MYSQL

4.删除数组或数组元素,使用delete函数delete array                 #删除整个数组

delete array[item]           #删除某个数组元素(item)

5.排序:awk中的asort函数可以实现对数组的值进行排序,不过排序之后的数组下标改为从1到数组的长度。在gawk 3.1.2以后的版本还提供了一个asorti函数,这个函数不是依据关联数组的值,而是依据关联数组的下标排序,即asorti(array)以后,仍会用数字(1到数组长度)来作为下标,但是array的数组值变为排序后的原来的下标,除非你指定另一个参数如:asorti(a,b)。[root@localhost~]# echo 'aa

bb

aa

bb

cc' |\

awk '{a[$0]++}END{l=asorti(a);for(i=1;i<=l;i++)print a[i]}'

aa

bb

cc

[root@localhost~]# echo 'aa

bb

aa

bb

cc' |\

awk '{a[$0]++}END{l=asorti(a,b);for(i=1;i<=l;i++)print b[i],a[b[i]]}'

aa 2

bb 2

cc 1

[root@localhost~]# echo "a

1

0

b

2

10

8

100" |

awk '{a[$0]=$0} #建立数组a,下标为$0,赋值也为$0

END{

len=asort(a)      #利用asort函数对数组a的值排序,同时获得数组长度len

for(i=1;i<=len;i++) print i "\t"a[i]  #打印

}'

1       0

2       1

3       2

4       8

5       10

6       100

7       a

8       b

6.去重[root@localhost~]# cat file

1

2

1

3

4

5

6

[root@localhost~]# awk 'a[$1]++' file

1

[root@localhost~]# awk '!a[$1]++' file

1

2

3

4

5

6

7.求和[root@localhost~]# cat file

s1 4

s1 64

s2 1

[root@localhost~]# awk '$1~/s1/{a+=$2}END{print a}' file

68

[root@localhost~]# cat file

aaa 1

aaa 1

ccc 1

aaa 1

bbb 1

[root@localhost~]# awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' file

aaa 3

bbb 1

ccc 1

8.通过split函数建立数组:数组的下标为从1开始的数字split(s, a [, r]) # s:string, a:array name,[,r]:regular expression。[root@localhost~]# echo 'abcd' |awk '{len=split($0,a,"");for(i=1;i<=len;i++) print "a["i"] = " a[i];print "length = " len}'

a[1] = a

a[2] = b

a[3] = c

a[4] = d

length = 4

求1月份相同名字和总和[root@localhost~]# cat file

Tom     2012-12-11      car     5       3000

John    2013-01-13      bike    4       1000

vivi    2013-01-18      car     4       2800

Tom     2013-01-20      car     3       2500

John    2013-01-28      bike    6       3500

[root@localhost~]# awk '{split($2,a,"-");if(a[2]==01){b[$1]+=$5}}END{for(i in b)print i,b[i]}' file

vivi 2800

Tom 2500

John 4500

9.求平均数[root@localhost~]# cat file

/circlelistbytjid,耗时:25ms

/circlelistbytjid,耗时:24ms

/circlelistbytjid,耗时:21ms

/circlelistbytjid,耗时:13ms

/circlelistbytjid,耗时:25ms

/circlelistbytjid,耗时:13ms

/circlelistbytjid,耗时:23ms

/circlelistbytjid,耗时:24ms

[root@localhost~]# awk -F: '{a+=+$2}END{print a/NR}' file

21

[root@localhost~]# cat file

alex 20

tom 30

alex 10

tom 20

[root@localhost~]# awk '{a[$1]+=$2;b[$1]++}END{for(i in a) print i,a[i]/b[i]}' file

alex 15

tom 25

10.求最大值

获取数字字段最大值[root@localhost~]# cat file

a b 1

c d 2

e f 3

g h 3

i j 2

[root@localhost~]# awk 'BEGIN{max=0}{if($3>max)max=$3}END{print max}' file

3

打印第三字段最大行[root@localhost~]# awk 'BEGIN{max=0}{a[$0]=$3;if($3>max)max=$3}END{for(v in a)if(a[v]==max)print v}' file

e f 3

g h 3

11.合并file1和file2,除去重复项[root@localhost~]#cat file1

aaa

bbb

ccc

ddd

[root@localhost~]#cat file2

aaa

eee

ddd

fff

[root@localhost~]# awk 'NR==FNR{a[$0]=1;print}   #读取file1,建立数组a,下标为$0,并赋值为1,然后打印

NR>FNR{                   #读取file2

if(!(a[$0])) {print }      #如果file2 的$0不存在于数组a中,即不存在于file1,则打印。

}' file1 file2

aaa

bbb

ccc

ddd

eee

fff

提取文件1中有,但文件2中没有:[root@localhost~]# awk 'NR==FNR{a[$0]=1}           #读取file2,建立数组a,下标为$0,并赋值为1

NR>FNR{                   #读取file1

if(!(a[$0])) {print }      #如果file1 的$0不存在于数组a中,即不存在于file2,则打印。

}' file2 file1

bbb

ccc

参考文章:http://bbs.chinaunix.net/thread-2312439-1-2.html

linux awk 数组,shell数组和awk数组相关推荐

  1. linux中利用脚本编写数组,shell脚本编程之数组

    bash仅支持一维数组,类型声明: declare -i    : 表示数值 declare -a  :表示普通数组(默认,可不用声明类型) declare -A :表示关联数组(必须声明类型,bas ...

  2. Shell编程:awk使用总结

    1. 什么是awk awk是Unix/Linux提供的样式扫描与处理工具,非常擅长处理结构化数据和生成表单.与sed 和grep 很相似,但功能却超过大于两者,由于awk具备各种脚本语言的特点,所以也 ...

  3. shell脚本中awk应用,数组的定义使用

    1.awk的基础应用 1.1,概念 除了使用 sed 命令,Linux 系统中还有一个功能更加强大的文本数据处理工具,就是 awk.它诞生于 20 世纪 70 年代末期,这也许是它影响了众多 Linu ...

  4. linux——awk(7):awk数组详解

    awk中数组的使用.我们在其他语言中经常会使用到数组,awk中也可以使用.示例如下: 与其他不同的是,awk中的数组元素值可以设置为"空字符串",当设定某一个元素为"空字 ...

  5. shell脚本之awk数组

    一.数组格式 数组是一个包含一系列元素的表. 格式如下: abc[1]="xiaohong" abc[2]="xiaolan" 解释: abc:为数组名称 [1 ...

  6. linux利用位置参数数组,Shell编程1_变量、参数和数组

    目录 一.从变量开始 1.环境变量 export命令 2.系统自带的环境变量 3.变量的定义和赋值 二.使用参数 参数的获取 三.数组的基本使用 1.数组的定义 2.数组的删除 3.数组的切片和替换 ...

  7. linux数组shell数组添加内容,shell数组的定义与应用

    bash支持一维数组(不支持多维数组),并且没有限定数组的大小.类似与C语言,数组元素的下标由0开始编号.获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0.shell 下的多 ...

  8. linux shell脚本传数组参数,shell脚本----函数和数组

    目录 一.shell函数 1.简介 2.格式 3.函数调用 4.示例演示 5.递归函数 二.shell数组 1.数组 2.Shell 数组的定义 3.获取数组元素 4.元素切片,替换,删除 5.示例演 ...

  9. linux jq 数组,Shell 数组

    Shell 数组 数组中可以存放多个值.Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似). 与大部分编程语言类似,数组元素的下标由0开始. She ...

最新文章

  1. c语言作业算术表达式求值,算术表达式求值演示(C语言版)
  2. 当img 路径为空时不显示x号
  3. android点击视频使用固定应用打开,Android 使用intent打开手机自带应用播放视频,音频,文档,还有打开应用市场...
  4. 功能测试话题分享-0323
  5. HttpClient的性能隐患
  6. 比较全的C语言面试题
  7. JavaScript 灯泡暗亮
  8. python中字典类型中的item是什么-Python中的字典介绍
  9. ubuntu linux 使用常见问题
  10. html怎么添加背景图片_万能的产品介绍PPT页面是怎么炼成的?
  11. 启动vue项目的时候报错提示To install it, you can run: npm install --save core-js/modules/es.regexp.dot
  12. wireshark图解ip报文分片
  13. html代码中数学公式,html中使用mathjax数学公式
  14. jquery的odd和even
  15. 信息学奥赛一本通 1357:车厢调度(train)
  16. 买礼物(线段树+set维护)
  17. 网球目标检测——基于Python-OpenCV
  18. Python编程-使用爬虫程序爬取肺炎疫情数据-1 爬取给定国家的历史疫情信息
  19. 第九届蓝桥杯省赛JAVA语言 C组题解_题7 缩位求和
  20. 【django】settings.py配置文件内容详细介绍

热门文章

  1. 代码实现-浏览器访问socket服务(简单)
  2. oracle四个时间的交集,oracle交集
  3. Linux下保存/不保存退出vi,vim编辑
  4. Nihilist—矩阵式替换密码
  5. 美国埃博拉疫苗从何而来?
  6. 【51单片机】在51单片机上用C语言实现循环点亮8盏LED灯
  7. 计算机操作系统安装与应用软件安装不了,电脑什么程序都不能安装了怎么办?...
  8. 彩光价格一般是多少_复合彩光祛斑价格多少
  9. 3990X和2002年超级计算机,AMD太超前!Win10将64核128线程撕裂者3990X CPU识别为双路...
  10. java黑名单校验_短信验证码被刷怎么办?java 短信验证码防刷策略