写点什么

Linux awk 命令

发布于: 2021 年 04 月 04 日
Linux awk命令

awk 是 linux 下的一个命令,他对其他命令的输出、对文件的处理都十分强大,其实他更像一门编程语言,可以自定义变量、条件语句、循环、数组、正则、函数等。可以读取输出,读取文件的方式是一行一行的读,根据给出的条件进行查找,并在找出来的行中进行操作。awk 有三种形势,awk,gawk,nawk

awk 中的记录,域,分割符

读取输出或者读取文件时,读取一行就是一个记录。记录分割符默认是回车符,保存在 RS,ORS 中。


从记录中分割出需要单词或者词组时,行中的每个字符串定义为域,域分割符默认是空格和 TAB 符,保存在 ORS 中。


举个例子:


aaaa:bbbb:ccccccc1111:2343:5t43343
复制代码


上面有二行,这二行就是二个记录,每行后面的回车呢,就是记录分割符,里面冒号呢,就是域分割符,分割出来的 aaaa、1111 这类东西就是域了。


awk -F: '{print $1}' testfile
复制代码

awk 的内建变量和运算符

  1. 变量



  1. 运算符



四. awk 的正则


awk 的函数

  1. 字符串函数


  1. 数学函数


实例

学习 awk 的时候,做了一个例子,学东西,不要光看,光看是记不住东西的。光看的话,也许你知道怎么回事,真正实际操作,不是这儿有问题,就是那儿有问题。所以一定要动手亲自操作一下。


  1. 测试文件 test


root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/bin/falsedaemon:x:2:2:daemon:/sbin:/bin/falsemail:x:8:12:mail:/var/spool/mail:/bin/falseftp:x:14:11:ftp:/home/ftp:/bin/false&nobody:$:99:99:nobody:/:/bin/falsezhangy:x:1000:100:,,,:/home/zhangy:/bin/bashhttp:x:33:33::/srv/http:/bin/falsedbus:x:81:81:System message bus:/:/bin/falsehal:x:82:82:HAL daemon:/:/bin/falsemysql:x:89:89::/var/lib/mysql:/bin/falseaaa:x:1001:1001::/home/aaa:/bin/bashba:x:1002:1002::/home/zhangy:/bin/bashtest:x:1003:1003::/home/test:/bin/bash@zhangying:*:1004:1004::/home/test:/bin/bashpolicykit:x:102:1005:Po
复制代码


例 1:


cat test | awk -F: '{\if ($1 == "root"){\print $1;\}else if($1 == "bin"){\print $2;\}else{\print $3;\} \}'
复制代码


例 2:


awk '{\for(i=0;i<NF;i++){\if ($i ~/^root/){\print $i;\}else if($i ~/zhangy/){\print $i;continue;\}else if($i ~/mysql/){\print $i;next;\}else if($i ~/^test/){\print $i;break;\} \}\}' test
复制代码


例 3:


tail test | awk 'BEGIN{while(getline d){ split(d,test);for(i in test){\print test[i]\}}}'
复制代码


例 4:


ls -al ~/test | awk 'BEGIN{while(getline d){ split(d,test);\print test[9] ;}}'
复制代码


例 5:


echo "32:34" |awk -F: '{print "max = ",max($1,$2)}\function max(one,two){\if(one > two){\return one;\}else{\return two;\}\}\'
复制代码


例 6:


#awk 'BEGIN{print "what is your name"; getline name < "/dev/tty"}$1 ~name{print#"found name on line" NR}END{print "see you" name}' test#awk '{sub(/daemon/,"tankzhang");print}' test#awk '&#123;&#123;sub(/zhangy/,"tankzhang");$1};print}' test#awk '&#123;&#123;gsub(/zhangy/,"tankzhang");$1};print}' test#awk -F: '{print index("zhangy",$1)}' test#awk -F: '{print substr($1,1,2)}' testawk -F: '{mat=match($1,/^[a-zA-Z]+$/);print mat,RSTART,RLENGTH}' test
复制代码


例 7:


cat test |awk -F: '\NF != 7{\printf("line %d,does not have 7 fields:%s\n",NR,$0)}\$1 !~ /^[A-Za-z0-9]/{printf("line %d,non alpha and numeric user id:%s: %s\n",NR,$1,$0)}\$2 == "*" {printf("lind %d,no password:%s\n",NR,$0)}'
复制代码


发布于: 2021 年 04 月 04 日阅读数: 19
用户头像

多读书多看报,少吃零食多睡觉 2018.08.07 加入

还未添加个人简介

评论

发布
暂无评论
Linux awk命令