linux命令之awk
Posted hello world
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux命令之awk相关的知识,希望对你有一定的参考价值。
简介
awk命令的名称是取自三位创始人Alfred Aho 、Peter Weinberger 和 Brian Kernighan姓名的首字母,awk有自己的程序设计语言,设计简短的程序,读入文件,数据排序,处理数据,生成报表等功能。
awk 通常用于文本处理和报表生成,最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。
awk 通常以文件的一行为处理单位的,awk每接收文件的一行,然后执行相应的命令,来处理文本,完整的awk脚本通常用来格式化文本文件中的信息
使用方式
awk
\'{pattern + action}\'
{filenames}
pattern 表示 AWK 在数据中查找的内容,正则表达式,用斜杠括起来
action 是在找到匹配内容时所执行的一系列命令
花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组
使用说明
[hebinbin@iZ25y8wtfbqZ ~]$ awk \'{print $0}\' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
依次对/etc/passwd 中的每一行执行 print 命令,所有输出都发送到 stdout,所得到的结果与执行 cat /etc/passwd 完全相同
$0 $n表示
-F参数:指定分隔符,可指定一个或多个
root@iZ25me8kko3Z:~# awk -F "/" -F ":" \'{ print $1 " " $9 " " $0 }\' /etc/passwd root root:x:0:0:root:/root:/bin/bash daemon daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin bin:x:2:2:bin:/bin:/bin/sh sys sys:x:3:3:sys:/dev:/bin/sh
只查看test.txt文件20-30行内容
root@iZ25me8kko3Z:~# awk \'{if(NR>=20 && NR<=30) print $1}\' test.txt sock.close() print(\'%s break elif data data #print(data) #print(clients) #if if print(data)
BEGIN 和 END 模块
awk 在开始处理输入文件之前会执行 BEGIN 块,处理了输入文件中的所有行之后执行END块
统计/etc/passwd的账户人数
root@iZ25me8kko3Z:~# awk \'{count++;print $0;} END{print "user count is ",count}\' /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh ................. user count is 47
count是自定义变量,没有初始化默认是0,action{}中的多个语句用 ;隔开
root@iZ25me8kko3Z:~# awk \'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}\' /etc/passwd [start] user count is 0 root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh ..................... [end] user count is 47
统计某个文件夹下的文件占用的字节数
root@iZ25me8kko3Z:~# ll |awk \'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}\' [end]size is 3090190
awk运算符
root@iZ25me8kko3Z:~# awk \'BEGIN{a=5;a+=5;print a}\' 10
root@iZ25me8kko3Z:~# awk \'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}\'
0 1
root@iZ25me8kko3Z:~# awk \'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}\' 0 1 root@iZ25me8kko3Z:~# awk \'BEGIN{a="100testaa";if(a~/100/) {print "ok"}}\' ok root@iZ25me8kko3Z:~# echo|awk \'BEGIN{a="100testaaa"}a~/test/{print "ok"}\' ok
root@iZ25me8kko3Z:~# awk \'BEGIN{a=11;if(a>=9){print "ok"}}\' ok root@iZ25me8kko3Z:~# awk \'BEGIN{a;if(a>=b){print "ok"}}\' ok root@
root@iZ25me8kko3Z:~# awk \'BEGIN{a="b";print a=="b"?"ok":"err"}\' ok root@iZ25me8kko3Z:~# awk \'BEGIN{a="b";print a=="c"?"ok":"err"}\' err
awk内置变量
awk正则使用
awk \'/REG/{action} \' file,/REG/为正则表达式,可以将$0 中,满足条件的记录送入到:action 进行处理
root@iZ25me8kko3Z:/etc# awk \'/root/{print $0}\' passwd root:x:0:0:root:/root:/bin/bash
awk \'布尔表达式{action}\' file 仅当对前面的布尔表达式求值为真时, awk 才执行代码块
root@iZ25me8kko3Z:/etc# awk -F: \'$1=="root"{print $0}\' passwd root:x:0:0:root:/root:/bin/bash
awk 的 if、循环和数组
if条件语句
{ if ($1=="foo"){ if($2=="foo"){ print "uno" }else{ print "one" } }elseif($1=="bar"){ print "two" }else{ print "three" } }
循环结构
do...while
{ count=1do { print "I get printed at least once no matter what" } while ( count !=1 ) }
for
for ( initial assignment; comparison; increment ) { code block }
break continue
x=1 while(1) { print "iteration", x if ( x==10 ) { break } x++ }
x=1while (1) { if ( x==4 ) { x++ continue } print "iteration", x if ( x>20 ) { break } x++ }
数组 AWK 中的数组都是关联数组,数字索引也会转变为字符串索引
{ cities[1]=”beijing” cities[2]=”shanghai” cities[“three”]=”guangzhou” for( c in cities) { print cities[c] } print cities[1] print cities[“1”] print cities[“three”] }
常用字符串函数
以上是关于linux命令之awk的主要内容,如果未能解决你的问题,请参考以下文章