AWK一般在网上说是一种处理文本文件的语言,也是一个强大的文本分析工具。
虽然我也认同这种说法,但是在此我的认知是:
awk是逐行处理文本文件的语言/分析工具
从上面朱老师的图中可以看到,$0表示整行,其它的就是以分隔符进行划分的了
|
变量名称
|
代表意义
|
|
NF
|
每一行 ($0) 拥有的栏位总数
|
|
NR
|
目前 awk 所处理的是『第几行』数据
|
|
FS
|
目前的分隔字节,默认是空白键
|
命令参数格式
#awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
-F 指定输入分隔符【此处其实是可以使用多个分隔符进行分隔的,例:< awk -F '[-|]' '{print $3}' FileName>】
#cat /usr/local/mail/app/log/authenticator.log|grep 'none'|awk -F '[<>{}]' '{print $2,$4}'
-v 【options】的一种,用于设置变量的值
-v OFS="+++" 【使用变量要配合-v选项】OFS可以设定awk的输出分隔符
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名 【显示当前处理的文件名】
FNR 浏览文件的记录数【如同时处理多个文件,会分别计算行数】
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
ORS 输出记录分隔符【真正的输出行分隔符】
RS 控制记录分隔符 【默认是以换行作为行分隔,比如需要定义空格作为行分隔】
#BEGIN表示在开始逐行处理文件之前指定的动作
#END表示在结束逐行处理文件之后指定的动作
例:
#awk 'BEGIN{print "aaaa","bbbb"} {print $1,$2} END{print "cccc","dddd"}' test
分隔符: -F 进行定义
#awk -F# '{print $1,$2}' test
#awk -F “#” '{print $1,$2}' test
#awk -v FS='#' '{print $1,$2}' test
awk支持的关系运算符
关系运算符 含义 用法示例
< 小于 x<y
<= 小于等于 x<=y
== 等于 x==y
!= 不等于 x!=y
>= 大于等于 x>=y
> 大于 x>y
~ 与对应 与此同时匹配则为真 x ~ /正则/
!~ 与对应的正则不匹配则为真 x !~ /正则/
awk 模式
1、空模式
2、关系运算模式
3、BEGIN/END模式
4、正则模式
5、行范围模式
awk正则格式
awk使用的正则用法属于“扩展正则表达式”,当使用{x,y}这咎次数匹配的正则表达式时,需要配合--posix选项或者--re-interval选项
#awk '/正则表达式/{}' filename
例:
#awk -F ":" 'BEGIN{printf "%-10s%-10s\n","用户名","用户ID"} /^zsy/{printf "%-10s\t%-10s\n",$1,$3}' /etc/passwd
#awk '/\/bin\/bash$/{print $0}' /etc/passwd 《注意转义字符》
#awk --posix '/he{2,3}y/{print $0}' test3 《注意需要使用--posix》
#awk --re-interval '/he{2,3}y/{print $0}' test3 《或者使用--re-interval》
awk行范围模式
例:搜索某两个内容之间出现的行
#awk '/正则1/,/正则2/{动作}' /some/file
#awk 'NR>=3 && NR<=6 {print $0}' filename
例:awk提取IP地址的一个示例
#awk --posix '$2~/192\.168\.[0-9]{1,3}\.[0-9]\.{1,3}/{print $1,$2}' filename
awk中使用IF
#awk -F ":" '{if($3<500){print $1,"系统用户"} else{print $1,"普通用户"} }' /etc/passwd
#awk 'BEGIN{ for(i=0;i<6;i++){if(i=3){continue}; print i}}'
NEXT可以促使AWK不对当前行执行对应的动作,而直接处理下一行
#awk '{ if(NR==2){ next }; print $0}' test9
AWK数组
#awk 'BEGIN{ a[1]="a1";a[2]="a2"; for(i=1;i<=2;i++){print i,a[i]} }'
#awk 'BEGIN{ a[1]="a1";a[2]="a2"; for(i in a){print i,a[i]} }'
统计某个IP出现的次数
#awk '{ count[$i]++} END{ for(i in count){print i,count[i]} }' test10
算数函数
rand函数、srand函数、int函数
rand函数生成随机数,但是是固定的,需要结合srand
随机一个数
#awk 'BEGIN{print rand()}'
#awk 'BEGIN{srand(); print rand()}'
随机一个数,并且乘以100
#awk 'BEGIN{srand(); print 100*rand()}'
生成一个随机数,乘以100,并且截取整数部分
#awk 'BEGIN{srand(); print int(100*rand())}'
字符串函数
gsub
例:将第一列中的小写字母“l"都替换成大写字母”L",【$1表示第一列,如果删除$1,则表示所有的均替换】
#awk '{gsub("l","L",$1);print $0}' test11
#awk '{gsub("[a-z]","6",$1);print $0}' test11
sub 表示替换指定范围内第一次匹配到的符合条件的字符,使用方法与gsub一样,不举例
length 获取指定字符串的长度,如果不传入任何字符,则以$0作为参数
#awk '{for(i=1;i<=NF;i++){print $i,length($i)}}' test11
index获取指定字符串位于整个字符串中的位置,示例:<如果不存在则返回0>
#awk '{print index($0,"Lee")}' test11
split 将指定的字符串按照指定的分割符切割,将切割后的每一段赋值到数组的元素中,从而动态创建数组,示例如下:
并且split函数的返回值的内容是数组的长度:
split分割后的数组的下标是从1开始
#awk -v ts="大娃;二娃;三娃" ' BEGIN{split(ts,huluwa,";"); for(i in huluwa){print huluwa[i]} } '
#awk -v ts="大娃;二娃;三娃" 'BEGIN{ print split(ts,huluwa,";" )}'
#awk -v ts="qq te ab th" 'BEGIN{ arrlen=split(ts,arr," "); for(i=1;i<=arrlen;i++){print i,arr[i]} }'
asort根据元素的值进行排序
#awk 'BEGIN{ t["a"]=66;t["b"]=3; asort(t); for(i in t){print i,t[i]}}'
#awk 'BEGIN{ t["a"]=66;t["b"]=3; asort(t); for(i in t){print i,t[i]} }'
#awk 'BEGIN{ t["a"]=66;t["b"]=3; asort(t,newt); for(i in newt){print i,newt[i]} }'
三元运算
普通示例:获取UID小于500的用户,进行判断是否是普通用户
#awk -F ":" '{if($3<500){usertype="系统用户"}else{usertype="普通用户"};print $1,usertype}' /etc/passwd
三元运算的写法
#awk -F ":" '{usertype=$3<500?"系统用户":"普通用户";print $1,usertype}' /etc/passwd
#awk -F ":" '{$3<500?a++:b++} END{print a,b}' /etc/passwd
打印奇偶行<i初始值为0,再利用!进行取反>
打印奇数行
#awk 'i=!i' test2
打印偶数行
#awk '!(i=!i)' test2
- Linux awk命令使用方法
awk是linux上非常好用的文本处理工具,常用于指定列的处理,包括获取指定列的内容.根据指定列匹配关系输出等文本处理.本文主要描述awk命令的基本语法.正则表达式与操作符的使用.常用内置变量的含义和 ...
- 【三剑客】awk命令
前言 awk是一种很棒的语言,它适合文本处理和报表生成. 模式扫描和处理.处理文本流. awk不仅仅是Linux系统中的一个命令,而是一种编程语言,可以用来处理数据和生成报告. 处理的数据: 可以是一 ...
- linux awk命令详解
linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...
- awk命令详解
搜索 纠正错误 添加实例 awk 文本和数据进行处理的编程语言 补充说明 awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件 ...
- Linux安全基础:awk命令的使用
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
- AWK命令学习
使用方法 awk 'pattern {action}' {filenames} 尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到 ...
- awk 命令
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
- AWK命令的用法
1.awk命令简介: awk是一种可以处理数据.产生格式化报表的语言,功能十分强大. awk的工作方式是读取数据,将每一行数据视为一条记录(record)每笔记录以字段分隔符分成若干字段,然后输出各个 ...
- [Linux] linux awk命令详解
reference : http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 简介 awk是一个强大的文本分析工具,相对于g ...
随机推荐
- V-REP Remote API(C++)实现简单的关节转动
基础内容参考:https://www.cnblogs.com/eternalmoonbeam/p/10753149.html V-REP客户端设置: 在V-REP场景文件中需要添加三个实体,包括两个形 ...
- Axis2 服务器端抛出ServiceClass object does not implement问题解决方法
在用eclipse配合Axis2进行开发的时候,编译通过,启动tomcat也顺利,但是就是在调用服务器端的服务时,会抛出: The ServiceClass object does not imple ...
- 004之MFCSocket同步编程(指针机制)
异步与同步通信相比较,前者是非阻塞模式,后者是阻塞模式.有关两者差异在此博主中有详细讲解,推荐:https://www.cnblogs.com/wzsblogs/p/4671559.html. 采用同 ...
- VUE页面渲染问题
<!DOCTYPE html> <html> <head> <script src="./vue.min.js"></scri ...
- 用spring的@Scheduled实现定时任务
先在spring的配置文件中添加扫描 在applicationContext.xml中添加 <task:annotation-driven/>,我用的是idea有提示功能 选择第一个后会 ...
- tensorflow_目标识别object_detection_api,RuntimeError: main thread is not in main loop,fig = plt.figure(frameon=False)_tkinter.TclError: no display name and no $DISPLAY environment variable
最近在使用目标识别api,但是报错了: File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/script_o ...
- 模型压缩,模型减枝,tf.nn.zero_fraction,统计0的比例,等。
我们刚接到一个项目时,一开始并不是如何设计模型,而是去先跑一个现有的模型,看在项目需求在现有模型下面效果怎么样.当现有模型效果不错需要深入挖掘时,仅仅时跑现有模型是不够的,比如,如果你要在嵌入式里面去 ...
- linux大文件读取
在生产环境中有时候可能会遇到大文件的读取问题,但是大文件读取如果按照一般的手法.如cat这种都是对io的一个挑战,如果io扛得住还好,如果扛不住 造成的后果,如服务器内存奔溃,日志损坏 方法一: se ...
- Python中的进程
进程 from multiprocessing import Process import time def start(name): time.sleep(1) print('hello', nam ...
- Git命令解释
pwd命令: Print Working Directory 显示工作目录的路径名称.