linux awk命令的使用
ak介绍
1、概述
(1)ak是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具。数据可以来自标准输入、一个或多个文件,或其它命令的输出。
(2)ak的处理文本和数据的方式逐行扫描文件,默认从第一行到一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
(3)ak分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。
gak是ak的GNU版本,它提供了Bell实验室和GNU的一些扩展。
(4)下面介绍的ak是以GNU的gak为例的,在linux系统中已把ak链接到gak,所以下面全部以ak进行介绍。
2、ak的作用
(1)ak用来处理文件和数据的,是类unix下的一个工具,也是一种编程语言
(2)可以用来统计数据,比如网站的访问量,访问的IP量等等
(3)支持条件判断,支持for和hile循环
ak使用方式
1、命令行模式使用
(1)语法结构
ak 选项 '命令部分' 文件名 特别说明引用shell变量需用双引号引起
(2)常用选项介绍
-F 定义字段分割符号,默认的分隔符是空格 cut -d: -f1 -v 定义变量并赋值
(3)‘命令部分说明’
① 正则表达式,地址定位
'/root/{ak语句}' sed中 '/root/p' 'NR==1,NR==5{ak语句}' sed中 '1,5p' '/^root/,/^ftp/{ak语句}' sed中'/^root/,/^ftp/p'
② {ak语句1;ak语句2;…}
'{print $0;print $1}' sed中'p' 'NR==5{print $0}' sed中'5p' 注ak命令语句间用分号间隔
③ BEGIN…END…
'BEGIN{ak语句};{处理中};END{ak语句}' 'BEGIN{ak语句};{处理中}' '{处理中};END{ak语句}'
2、脚本模式使用
(1)脚本编写
#!/bin/ak -f 定义魔法字符 以下是ak引号里的命令清单,不要用引号保护命令,多个命令用分号间隔 BEGIN{FS=":"} NR==1,NR==3{print $1"t"$NF} ...
(2)脚本执行
方法1 ak 选项 -f ak的脚本文件 要处理的文本文件 ak -f ak.sh filename sed -f sed.sh -i filename 方法2 ./ak的脚本文件(或者绝对路径) 要处理的文本文件 ./ak.sh filename ./sed.sh filename
ak内部相关变量
1、常用内置变量举例
ak -F: '{print $1,$(NF-1)}' 1.txt ak -F: '{print $1,$(NF-1),$NF,NF}' 1.txt ak '/root/{print $0}' 1.txt ak '/root/' 1.txt ak -F: '/root/{print $1,$NF}' 1.txt ak 'NR==1,NR==5' 1.txt ak 'NR==1,NR==5{print $0}' 1.txt ak 'NR==1,NR==5;/^root/{print $0}' 1.txt
2、内置变量分隔符举例
FS和OFS: ak 'BEGIN{FS=":"};/^root/,/^lp/{print $1,$NF}' 1.txt ak -F: 'BEGIN{OFS="tt"};/^root/,/^lp/{print $1,$NF}' 1.txt root /bin/bash bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin lp /sbin/nologin ak -F: 'BEGIN{OFS="@@@"};/^root/,/^lp/{print $1,$NF}' 1.txt root@@@/bin/bash bin@@@/sbin/nologin daemon@@@/sbin/nologin adm@@@/sbin/nologin lp@@@/sbin/nologin [root@server shell07]# RS和ORS 修改源文件前2行增加制表符和内容 vim 1.txt root:x:0:0:root:/root:/bin/bash hello orld bin:x:1:1:bin:/bin:/sbin/nologin test1 test2 # ak 'BEGIN{RS="t"};{print $0}' 1.txt # ak 'BEGIN{ORS="t"};{print $0}' 1.txt
ak工作原理
ak -F: '{print $1,$3}' /etc/passd
1、ak使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符(RS)结束
2、每行被间隔符:(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始
问ak如何知道用空格来分隔字段的呢?
答因为有一个内部变量FS来确定字段分隔符。初始时,FS赋为空格
3、ak使用print函数打印字段,打印出来的字段会以空格分隔,因为$1,$3之间有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符OFS,OFS默认为空格
4、ak处理完一行后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕
ak使用进阶
1、格式化输出print和printf
print函数 类似echo "hello orld" # date |ak '{print "Month: "$2 "nYear: "$NF}' # ak -F: '{print "username is: " $1 "t uid is: "$3}' /etc/passd printf函数 类似echo -n # ak -F: '{printf "%-15s %-10s %-15sn", $1,$2,$3}' /etc/passd # ak -F: '{printf "|%15s| %10s| %15s|n", $1,$2,$3}' /etc/passd # ak -F: '{printf "|%-15s| %-10s| %-15s|n", $1,$2,$3}' /etc/passd ak 'BEGIN{FS=":"};{printf "%-15s %-15s %-15sn",$1,$6,$NF}' a.txt %s 字符类型 strings %-20s %d 数值类型 占15字符 - 表示左对齐,默认是右对齐 printf默认不会在行尾自动换行,加n
2、ak变量定义
# ak -v NUM=3 -F: '{ print $NUM }' /etc/passd # ak -v NUM=3 -F: '{ print NUM }' /etc/passd # ak -v num=1 'BEGIN{print num}' 1 # ak -v num=1 'BEGIN{print $num}' 注意 ak中调用定义的变量不需要加$
3、ak中BEGIN…END使用
①BEGIN表示在程序开始前执行
②END 表示所有文件处理完后执行
③用法‘BEGIN{开始处理之前};{处理中};END{处理结束后}’
4、ak和正则的综合运用
5、ak的脚本编程
(1)流程控制语句
① if结构
if语句 if [ xxx ];then xxx fi 格式 ak 选项 '正则,地址定位{ak语句}' 文件名 { if(表达式){语句1;语句2;...}} ak -F: '{if($3>=500 && $3<=60000) {print $1,$3} }' passd # ak -F: '{if($3==0) {print $1"是管理员"} }' passd root是管理员 # ak 'BEGIN{if('$(id -u)'==0) {print "admin"} }' admin
② if…else结构
if...else语句: if [ xxx ];then xxxxx else xxx fi 格式 {if(表达式){语句;语句;...}else{语句;语句;...}} ak -F: '{ if($3>=500 && $3 != 65534) {print $1"是普通用户"} else {print $1,"不是普通用户"}}' passd ak 'BEGIN{if( '$(id -u)'>=500 && '$(id -u)' !=65534 ) {print "是普通用户"} else {print "不是普通用户"}}'
③ if…elif…else结构
if [xxxx];then xxxx elif [xxx];then xxx .... else ... fi if...else if...else语句 格式 { if(表达式1){语句;语句;...}else if(表达式2){语句;语句;...}else if(表达式3){语句;语句;...}else{语句;语句;...}}
(2)循环语句
① for循环
打印1~5 for ((i=1;i<=5;i++));do echo $i;done # ak 'BEGIN { for(i=1;i<=5;i++) {print i} }' 打印1~10中的奇数 # for ((i=1;i<=10;i+=2));do echo $i;done|ak '{sum+=$0};END{print sum}' # ak 'BEGIN{ for(i=1;i<=10;i+=2) {print i} }' # ak 'BEGIN{ for(i=1;i<=10;i+=2) print i }' 计算1-5的和 # ak 'BEGIN{sum=0;for(i=1;i<=5;i++) sum+=i;print sum}' # ak 'BEGIN{for(i=1;i<=5;i++) (sum+=i);{print sum}}' # ak 'BEGIN{for(i=1;i<=5;i++) (sum+=i);print sum}'
② hile循环
打印1-5 # i=1;hile (($i<=5));do echo $i;let i++;done # ak 'BEGIN { i=1;hile(i<=5) {print i;i++} }' 打印1~10中的奇数 # ak 'BEGIN{i=1;hile(i<=10) {print i;i+=2} }' 计算1-5的和 # ak 'BEGIN{i=1;sum=0;hile(i<=5) {sum+=i;i++}; print sum }' # ak 'BEGIN {i=1;hile(i<=5) {(sum+=i) i++};print sum }'
③ 嵌套循环
嵌套循环 #!/bin/bash for ((y=1;y<=5;y++)) do for ((x=1;x<=$y;x++)) do echo -n $x done echo done ak 'BEGIN{ for(y=1;y<=5;y++) {for(x=1;x<=y;x++) {printf x} ;print } }' 尝试用三种方法打印99口诀表 #ak 'BEGIN{for(y=1;y<=9;y++) { for(x=1;x<=y;x++) {printf x""y"="xy"t"};print} }' #ak 'BEGIN{for(y=1;y<=9;y++) { for(x=1;x<=y;x++) printf x""y"="xy"t";print} }' #ak 'BEGIN{i=1;hile(i<=9){for(j=1;j<=i;j++) {printf j""i"="ji"t"};print;i++ }}' #ak 'BEGIN{for(i=1;i<=9;i++){j=1;hile(j<=i) {printf j""i"="ij"t";j++};print}}' 循环的控制 break 条件满足的时候中断循环 continue 条件满足的时候跳过循环
(3)ak算数运算
+ - / %(模) ^(幂2^3) 可以在模式中执行计算,ak都将按浮点数方式执行算术运算 # ak 'BEGIN{print 1+1}' # ak 'BEGIN{print 11}' # ak 'BEGIN{print 23}' # ak 'BEGIN{print 2/3}'
空调维修
- 海信电视维修站 海信电视维修站点
- 格兰仕空调售后电话 格兰仕空调维修售后服务电
- 家电售后服务 家电售后服务流程
- 华扬太阳能维修 华扬太阳能维修收费标准表
- 三菱电机空调维修 三菱电机空调维修费用高吗
- 美的燃气灶维修 美的燃气灶维修收费标准明细
- 科龙空调售后服务 科龙空调售后服务网点
- 华帝热水器维修 华帝热水器维修常见故障
- 康泉热水器维修 康泉热水器维修故障
- 华凌冰箱维修电话 华凌冰箱维修点电话
- 海尔维修站 海尔维修站点地址在哪里
- 北京海信空调维修 北京海信空调售后服务
- 科龙空调维修 科龙空调维修故障
- 皇明太阳能售后 皇明太阳能售后维修点
- 海信冰箱售后服务 海信冰箱售后服务热线电话
- 海尔热水器服务热线