欢迎访问 生活随笔!

尊龙游戏旗舰厅官网

当前位置: 尊龙游戏旗舰厅官网 > 编程资源 > 编程问答 >内容正文

编程问答

awk 实例演示 -尊龙游戏旗舰厅官网

发布时间:2025/1/21 编程问答 23 豆豆
尊龙游戏旗舰厅官网 收集整理的这篇文章主要介绍了 awk 实例演示 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

2019独角兽企业重金招聘python工程师标准>>>

一.参数解释:

(1)-f fs or --field-separator fs :指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-f:。 (2)-v var=value or --asign var=value :赋值一个用户定义变量。 (3)-f scripfile or --file scriptfile :从脚本文件中读取awk命令。 (4)-mf nnn and -mr nnn :对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是bell实验室版awk的扩展功能,在标准awk中不适用。 (5)-w compact or --compat, -w traditional or --traditional :在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。 (6)-w copyleft or --copyleft, -w 尊龙游戏旗舰厅官网 copyright or --尊龙游戏旗舰厅官网 copyright :打印简短的尊龙游戏旗舰厅官网的版权信息。 (7)-w help or --help, -w usage or --usage :打印全部awk选项和每个选项的简短说明。 (8)-w lint or --lint :打印不能向传统unix平台移植的结构的警告。 (9)-w lint-old or --lint-old :打印关于不能向传统unix平台移植的结构的警告。 (10)-w posix :打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。 (11)-w re-interval or --re-inerval :允许间隔正则表达式的使用,参考(grep中的posix字符类),如括号表达式[[:alpha:]]。 (12)-w source program-text or --source program-text :使用program-text作为源代码,可与-f命令混用。 (13)-w version or --version :打印bug报告信息的版本。

二.内建变量

$0当前记录(这个变量中存放着整个行的内容) 整行内容 $1~$n当前记录的第n个字段,字段间由fs分隔 fs输入字段分隔符 默认是空格或tab nf当前记录中的字段个数,就是有多少列 nr已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。 fnr当前记录数,与nr不同的是,这个值会是各个文件自己的行号rs输入的记录分隔符, 默认为换行符 ofs输出字段分隔符, 默认也是空格 ors输出的记录分隔符,默认为换行符 filename当前输入文件的名字 subsep:数组下标分隔符

三.条件判断

1.单条件判断:

要留意的一个地方:

if 条件后面的语句块,如果是单个语句,可以省略花括号,如果是多个语句,必须用花括号

2.多条件判断:

再如:

awk -f':' '{if($1=="apple"){$var=$2 50;print $var}else if ($1=="orange"){$var=$3 20;print $var}else if ($1=="pear"){$var=$3 30;print $var}}' face.txt

执行结果如下:

四.循环结构

1.for循环

for循环的圆括号中需要3个表达式,前两个分别是初始化表达式和测试表达式,第3个则用于更新测试表达式所用的变量。在awk的for循环中,圆括号里的第一条语句只能初始化一个变量(c语言中与之对应的语句则可以用逗号分隔的形式初始化多个变量)。

2.while循环

使用while循环的第一步是给一个变量设初值,然后在while表达式中测试该变量。如果求得表达式的值为真(非0),则进入循环体执行其中的语句。如果循环体内有多条语句,就必须用花括号把这些语句括起来。循环块结束之前,一定要更新用来控制循环表达式的变量,否则循环将无休止地进行下去。do/while循环与while 循环很相似,唯一的区别在于do/while要先执行循环体至少一次,然后才测试表达式。

五.begin 与end语句

begin 用于匹配输入文件的第一行之前的位置, end 则用于输出匹配文件处理过后的最后一行的形式。通常使用 begin 来输出一个标题: 来显示变量和预置(初始化)变量,使用end来输出最终结果。

要注意的是: 此处例子的fs 分隔符要用双引号括起来。用作数字的awk变量的默认初始值为0,所以变量值为0的话就可以省略不写  。

再如:

六.拆分文件--根据某列的不同值进行分类归档

1.根据指定列的值输出全部内容的值

命令语句:

netstat -nptoa |awk 'nr!=1{print >$6}'  

说明:

nr!=1表示不处理表头(首行),示例演示的功能是根据第六列的不同值取文件名,再将所有列的值输出到先前不同文件名的文件里。

2.根据指定列的值定制输出想输出的列的内容

命令语句:

netstat -anopt|awk 'nr!=1{print $4,$5 >$6}'

解说:

该条命令实现的功能就是根据第6列的不同状态值取文件名,文件内容只包含第4,5列的值

七.统计,计数

1.统计文件夹下某种文件类型的文件大小

2.统计每个用户使用的内存大小

命令语句:

ps aux|awk 'nr!=1{a[$1] =$6}end{for (i in a) print i ":" a[i]"kb"}'

3.统计文件相同行的次数

命令语句:

a:  awk -f'.' '{print $1}' 44.txt |awk -f '//' '{print $2}'|sort -nr|awk '{a[$1] }end{for (i in a )print i,a[i]}' 

b: awk -f'.' '{print $1}' 44.txt |awk -f '//' '{print $2}'|sort -nr|awk '{a[$1] }end{for (i in a ){print i, a[i]}}'

c:  awk -f'.' '{print $1}' 44.txt |awk -f '//' '{print $2}'|sort -nr|awk '{a[$1] }end{for (i in a )print i a[i]}'  

备注: 留意下这三条命令在输出上的不同之处

4.删除文件中的重复行

5.在awk里嵌入系统命令

命令语句:

awk '!/^$/{a[$7] }end{for (i in a)printf "url:%-20s count:%d\n",i ,a[i]|"sort -nr -t':' -k4 " }' 2017-02-16-0000-2330_gxxxx.cn.log |head -n5

如同所示: 在awk里嵌入系统命令,需用双引号把系统命令引起来,单引号也不行。演示的功能是统计日志文件里各域名的次数,并按逆序输出

6.split函数

命令语句:

awk 'begin{split("3/10/2017",date,"/");print "the month is "date[1] " and the year is "date[3]}'

数组与split函数: awk的内置函数split能够将字符串拆分为词,然后保存在数组中。如未指定字段分隔符,也可以就用fs的当前值。
格式

split(字符串,数组,字段分隔符)

split(字符串,数组)

说明:将字符串3/10/2017保存到数组date中,用正斜杠作为字段分隔符。现在date[1]中是3,date[2]中是10,而date[3] 中则是2017。字段分隔符用第3个参数指定,如未指定,就以fs的值做字段分隔符。

八.字符匹配

模糊匹配: ~  精确匹配:  ==   不匹配:  !~   不精确匹配:  !==

转载于:https://my.oschina.net/szwyh2014/blog/856741

总结

以上是尊龙游戏旗舰厅官网为你收集整理的awk 实例演示的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得尊龙游戏旗舰厅官网网站内容还不错,欢迎将尊龙游戏旗舰厅官网推荐给好友。

网站地图