awk
时间:2019-09-17
本文章向大家介绍awk,主要包括awk使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 # 默认是执行打印全部 print $0 2 # 1为真 打印$0 3 # 0为假 不打印 4 5 -F # 改变FS值(分隔符) 6 ~ # 域匹配 7 == # 变量匹配 8 !~ # 匹配不包含 9 = # 赋值 10 != # 不等于 11 += # 叠加 12 13 \b # 退格 14 \f # 换页 15 \n # 换行 16 \r # 回车 17 \t # 制表符Tab 18 \c # 代表任一其他字符 19 20 -F"[ ]+|[%]+" # 多个空格或多个%为分隔符 21 [a-z]+ # 多个小写字母 22 [a-Z] # 代表所有大小写字母(aAbB...zZ) 23 [a-z] # 代表所有大小写字母(ab...z) 24 [:alnum:] # 字母数字字符 25 [:alpha:] # 字母字符 26 [:cntrl:] # 控制字符 27 [:digit:] # 数字字符 28 [:graph:] # 非空白字符(非空格、控制字符等) 29 [:lower:] # 小写字母 30 [:print:] # 与[:graph:]相似,但是包含空格字符 31 [:punct:] # 标点字符 32 [:space:] # 所有的空白字符(换行符、空格、制表符) 33 [:upper:] # 大写字母 34 [:xdigit:] # 十六进制的数字(0-9a-fA-F) 35 [[:digit:][:lower:]] # 数字和小写字母(占一个字符)
内建变量
1 $n # 当前记录的第 n 个字段,字段间由 FS 分隔 2 $0 # 完整的输入记录 3 ARGC # 命令行参数的数目 4 ARGIND # 命令行中当前文件的位置 ( 从 0 开始算 ) 5 ARGV # 包含命令行参数的数组 6 CONVFMT # 数字转换格式 ( 默认值为 %.6g) 7 ENVIRON # 环境变量关联数组 8 ERRNO # 最后一个系统错误的描述 9 FIELDWIDTHS # 字段宽度列表 ( 用空格键分隔 ) 10 FILENAME # 当前文件名 11 FNR # 同 NR ,但相对于当前文件 12 FS # 字段分隔符 ( 默认是任何空格 ) 13 IGNORECASE # 如果为真(即非 0 值),则进行忽略大小写的匹配 14 NF # 当前记录中的字段数(列) 15 NR # 当前行数 16 OFMT # 数字的输出格式 ( 默认值是 %.6g) 17 OFS # 输出字段分隔符 ( 默认值是一个空格 ) 18 ORS # 输出记录分隔符 ( 默认值是一个换行符 ) 19 RLENGTH # 由 match 函数所匹配的字符串的长度 20 RS # 记录分隔符 ( 默认是一个换行符 ) 21 RSTART # 由 match 函数所匹配的字符串的第一个位置 22 SUBSEP # 数组下标分隔符 ( 默认值是 /034) 23 BEGIN # 先处理(可不加文件参数)<br>END # 结束时处理
内置函数
1 gsub(r,s) # 在整个$0中用s替代r 相当于 sed 's///g' 2 gsub(r,s,t) # 在整个t中用s替代r 3 index(s,t) # 返回s中字符串t的第一位置 4 length(s) # 返回s长度 5 match(s,r) # 测试s是否包含匹配r的字符串 6 split(s,a,fs) # 在fs上将s分成序列a 7 sprint(fmt,exp) # 返回经fmt格式化后的exp 8 sub(r,s) # 用$0中最左边最长的子串代替s 相当于 sed 's///' 9 substr(s,p) # 返回字符串s中从p开始的后缀部分 10 substr(s,p,n) # 返回字符串s中从p开始长度为n的后缀部分
awk判断
1 awk '{print ($1>$2)?"第一排"$1:"第二排"$2}' # 条件判断 括号代表if语句判断 "?"代表then ":"代表else 2 awk '{max=($1>$2)? $1 : $2; print max}' # 条件判断 如果$1大于$2,max值为为$1,否则为$2 3 awk '{if ( $6 > 50) print $1 " Too high" ;\ 4 else print "Range is OK"}' file 5 awk '{if ( $6 > 50) { count++;print $3 } \ 6 else { x+5; print $2 } }' file
awk循环
1 awk '{i = 1; while ( i <= NF ) { print NF, $i ; i++ } }' file 2 awk '{ for ( i = 1; i <= NF; i++ ) print NF,$i }' file
1 awk '/Tom/' file # 打印匹配到得行 2 awk '/^Tom/{print $1}' # 匹配Tom开头的行 打印第一个字段 3 awk '$1 !~ /ly$/' # 显示所有第一个字段不是以ly结尾的行 4 awk '$3 <40' # 如果第三个字段值小于40才打印 5 awk '$4==90{print $5}' # 取出第四列等于90的第五列 6 awk '/^(no|so)/' test # 打印所有以模式no或so开头的行 7 awk '$3 * $4 > 500' # 算术运算(第三个字段和第四个字段乘积大于500则显示) 8 awk '{print NR" "$0}' # 加行号 9 awk '/tom/,/suz/' # 打印tom到suz之间的行 10 awk '{a+=$1}END{print a}' # 列求和 11 awk 'sum+=$1{print sum}' # 将$1的值叠加后赋给sum 12 awk '{a+=$1}END{print a/NR}' # 列求平均值 13 awk -F'[ :\t]' '{print $1,$2}' # 以空格、:、制表符Tab为分隔符 14 awk '{print "'"$a"'","'"$b"'"}' # 引用外部变量 15 awk '{if(NR==52){print;exit}}' # 显示第52行 16 awk '/关键字/{a=NR+2}a==NR {print}' # 取关键字下第几行 17 awk 'gsub(/liu/,"aaaa",$1){print $0}' # 只打印匹配替换后的行 18 ll | awk -F'[ ]+|[ ][ ]+' '/^$/{print $8}' # 提取时间,空格不固定 19 awk '{$1="";$2="";$3="";print}' # 去掉前三列 20 echo aada:aba|awk '/d/||/b/{print}' # 匹配两内容之一 21 echo aada:abaa|awk -F: '$1~/d/||$2~/b/{print}' # 关键列匹配两内容之一 22 echo Ma asdas|awk '$1~/^[a-Z][a-Z]$/{print }' # 第一个域匹配正则 23 echo aada:aaba|awk '/d/&&/b/{print}' # 同时匹配两条件 24 awk 'length($1)=="4"{print $1}' # 字符串位数 25 awk '{if($2>3){system ("touch "$1)}}' # 执行系统命令 26 awk '{sub(/Mac/,"Macintosh",$0);print}' # 用Macintosh替换Mac 27 awk '{gsub(/Mac/,"MacIntosh",$1); print}' # 第一个域内用Macintosh替换Mac 28 awk -F '' '{ for(i=1;i<NF+1;i++)a+=$i ;print a}' # 多位数算出其每位数的总和.比如 1234, 得到 10 29 awk '{ i=$1%10;if ( i == 0 ) {print i}}' # 判断$1是否整除(awk中定义变量引用时不能带 $ ) 30 awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}' # 列求最大值 设定一个变量开始为0,遇到比该数大的值,就赋值给该变量,直到结束 31 awk 'BEGIN{a=11111}{if ($1<a) a=$1 fi}END{print a}' # 求最小值 32 awk '{if(A)print;A=0}/regexp/{A=1}' # 查找字符串并将匹配行的下一行显示出来,但并不显示匹配行 33 awk '/regexp/{print A}{A=$0}' # 查找字符串并将匹配行的上一行显示出来,但并不显示匹配行 34 awk '{if(!/mysql/)gsub(/1/,"a");print $0}' # 将1替换成a,并且只在行中未出现字串mysql的情况下替换 35 awk 'BEGIN{srand();fr=int(100*rand());print fr;}' # 获取随机数 36 awk '{if(NR==3)F=1}{if(F){i++;if(i%7==1)print}}' # 从第3行开始,每7行显示一次 37 awk '{if(NF<1){print i;i=0} else {i++;print $0}}' # 显示空行分割各段的行数 38 echo +null:null |awk -F: '$1!~"^+"&&$2!="null"{print $0}' # 关键列同时匹配 39 awk -v RS=@ 'NF{for(i=1;i<=NF;i++)if($i) printf $i;print ""}' # 指定记录分隔符 40 awk '{b[$1]=b[$1]$2}END{for(i in b){print i,b[i]}}' # 列叠加 41 awk '{ i=($1%100);if ( $i >= 0 ) {print $0,$i}}' # 求余数 42 awk '{b=a;a=$1; if(NR>1){print a-b}}' # 当前行减上一行 43 awk '{a[NR]=$1}END{for (i=1;i<=NR;i++){print a[i]-a[i-1]}}' # 当前行减上一行 44 awk -F: '{name[x++]=$1};END{for(i=0;i<NR;i++)print i,name[i]}' # END只打印最后的结果,END块里面处理数组内容 45 awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}' # $2的总和 $2总和除个数(平均值) 46 awk 'BEGIN{ "date" | getline d; split(d,mon) ; print mon[2]}' file # 将date值赋给d,并将d设置为数组mon,打印mon数组中第2个元素 47 awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' # 截取字符串(substr使用) 48 awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' # 匹配字符串(index使用) 49 awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' # 正则表达式匹配查找(match使用) 50 awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' # 字符串分割(split使用) 51 awk '{for(i=1;i<=4;i++)printf $i""FS; for(y=10;y<=13;y++) printf $y""FS;print ""}' # 打印前4列和后4列 52 awk 'BEGIN{for(n=0;n++<9;){for(i=0;i++<n;)printf i"x"n"="i*n" ";print ""}}' # 乘法口诀 53 awk '{if (system ("grep "$2" tmp/* > /dev/null 2>&1") == 0 ) {print $1,"Y"} else {print $1,"N"} }' a # 执行系统命令判断返回状态 54 awk '{for(i=1;i<=NF;i++) a[i,NR]=$i}END{for(i=1;i<=NF;i++) {for(j=1;j<=NR;j++) printf a[i,j] " ";print ""}}' # 将多行转多列 55 awk 'BEGIN{printf "what is your name?";getline name < "/dev/tty" } $1 ~name {print "FOUND" name " on line ", NR "."} END{print "see you," name "."}' file # 两文件匹配 56 cat 1.txt|awk -F" # " '{print "insert into user (user,password,email)values(""'\''"$1"'\'\,'""'\''"$2"'\'\,'""'\''"$3"'\'\)\;'"}' >>insert_1.txt # 处理sql语句
取本机IP
1 /sbin/ifconfig |awk -v RS="Bcast:" '{print $NF}'|awk -F: '/addr/{print $2}' 2 /sbin/ifconfig |awk -v RS='inet addr:' '$1!="eth0"&&$1!="127.0.0.1"{print $1}'|awk '{printf"%s|",$0}' 3 /sbin/ifconfig |awk '{printf("line %d,%s\n",NR,$0)}' # 指定类型(%d数字,%s字符)
查看磁盘空间
1 df -h|awk -F"[ ]+|%" '$5>14{print $5}' 2 df -h|awk 'NR!=1{if ( NF == 6 ) {print $5} else if ( NF == 5) {print $4} }' 3 df -h|awk 'NR!=1 && /%/{sub(/%/,"");print $(NF-1)}' 4 df -h|sed '1d;/ /!N;s/\n//;s/ \+/ /;' #将磁盘分区整理成一行 可直接用 df -P
排列打印
1 awk 'END{printf "%-10s%-10s\n%-10s%-10s\n%-10s%-10s\n","server","name","123","12345","234","1234"}' txt 2 awk 'BEGIN{printf "|%-10s|%-10s|\n|%-10s|%-10s|\n|%-10s|%-10s|\n","server","name","123","12345","234","1234"}' 3 awk 'BEGIN{ 4 print " *** 开 始 *** "; 5 print "+-----------------+"; 6 printf "|%-5s|%-5s|%-5s|\n","id","name","ip"; 7 } 8 $1!=1 && NF==4{printf "|%-5s|%-5s|%-5s|\n",$1,$2,$3" "$11} 9 END{ 10 print "+-----------------+"; 11 print " *** 结 束 *** " 12 }' txt
老男孩awk经典题
1 分析图片服务日志,把日志(每个图片访问次数*图片大小的总和)排行,也就是计算每个url的总访问大小 2 说明:本题生产环境应用:这个功能可以用于IDC网站流量带宽很高,然后通过分析服务器日志哪些元素占用流量过大,进而进行优化或裁剪该图片,压缩js等措施。 3 本题需要输出三个指标: 【被访问次数】 【访问次数*单个被访问文件大小】 【文件名(带URL)】 4 测试数据 5 59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299 6 7 awk '{array_num[$7]++;array_size[$7]+=$10}END{for(i in array_num) {print array_num[i]" "array_size[i]" "i}}'
awk练习题
1 wang 4 2 cui 3 3 zhao 4 4 liu 3 5 liu 3 6 chang 5 7 li 2 8 通过第一个域找出字符长度为4的 9 当第二列值大于3时,创建空白文件,文件名为当前行第一个域$1 (touch $1) 10 将文档中 liu 字符串替换为 hong 11 求第二列的和 12 求第二列的平均值 13 求第二列中的最大值 14 将第一列过滤重复后,列出每一项,每一项的出现次数,每一项的大小总和 15 16 1、字符串长度 17 awk 'length($1)=="4"{print $1}' 18 2、执行系统命令 19 awk '{if($2>3){system ("touch "$1)}}' 20 3、gsub(/r/,"s",域) 在指定域(默认$0)中用s替代r (sed 's///g') 21 awk '{gsub(/liu/,"hong",$1);print $0}' a.txt 22 4、列求和 23 awk '{a+=$2}END{print a}' 24 5、列求平均值 25 awk '{a+=$2}END{print a/NR}' 26 awk '{a+=$2;b++}END{print a,a/b}' 27 6、列求最大值 28 awk 'BEGIN{a=0}{if($2>a) a=$2 }END{print a}' 29 7、将第一列过滤重复列出每一项,每一项的出现次数,每一项的大小总和 30 awk '{a[$1]++;b[$1]+=$2}END{for(i in a){print i,a[i],b[i]}}'
原文地址:https://www.cnblogs.com/alog9/p/11532744.html
- 几个行列转换的实用小例子(r4笔记第2天)
- History API与浏览器历史堆栈管理
- node中创建服务进程
- 数据挖掘工程师:如何通过百度地图API抓取建筑物周边位置、房价信息
- crontab导致CPU异常的问题分析及处理(r3笔记第100天)
- 短信接口被恶意调用(二)肉搏战-阻止恶意请求
- 关于首屏时间采集自动化的解决方案
- javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites
- 一次数据库无法登陆的问题及排查 (r3笔记第99天)
- 用深度学习keras的cnn做图像识别分类,准确率达97%
- 短信发送接口被恶意访问的网络攻击事件(三)定位恶意IP的日志分析脚本
- job处理缓慢的性能问题排查与分析(r4笔记第18天)
- 京东商品评论情感分析:数据采集与词向量构造方法
- springboot开启access_log日志输出
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【JMeter系列-9】 JMeter常用内置对象
- 【JMeter系列-10】JMeter websocket接口测试
- [Mysql-2] 远程连接数据库错误:host 'xxx.xxx' is blocked
- Linux超能力BPF技术介绍及学习分享(技术创作101训练营)
- 已创建好的vue项目引入vuex
- 【Mysql学习之旅-2】经典sql面试题及答案分析
- 【Mysql-3】条件判断函数-CASE WHEN、IF、IFNULL详解
- Linux设备树语法详解
- 【Mysql进阶-2】图文并茂说尽Mysql索引
- 1.8W字|了不起的 TypeScript 入门教程(第二版)
- 【Mysql进阶-3】大量实例悟透EXPLAIN与慢查询
- 基于helium自动化测试的方法进行代码仓库梳理和备份
- 【SpringBoot注解-5】web项目相关注解
- rxjs里的Observable对象如何消费
- 正则表达式入门