awk从懵逼到入门(一)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Real_cTo/article/details/100632981

 awk是一个非常牛逼的文本分析工具,尤其在数据分析并生成报告方面,他结合了grep的查找和sed的编辑,异常强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk 程序可由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部分组成
基本用法:awk [options] ‘program’ file

options如:-F “分隔符” 指明输入时用到的字段分隔符
-v var=vale 变量赋值
program:pattern{action statements;…}

pattern部分决定动作语句何时触发及触发事件,如BEGIN,END
action statements对数据进行处理,放在{}内指明,print, printf

分隔符、域和记录

 awk执行时,由分隔符分隔的字段(域)标记$1,$2…$n称为域标识。$0为所有域,即会打印出所有行,注意:此时 和shell中变量$符含义不同
 文件的每一行称为记录
 省略action,则默认执行 print $0 的操作


awk变量


FS:输入字段分隔符,默认为空白字符,即依据什么符号把一列一列字符分成$1;$2…

awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd   //把分隔符:定义为变量,可以调用
awk –F: '{print $1,$3,$7}’ /etc/passwd  //默认用-F后跟字符定义分隔符,不写默认分隔符为空格

OFS:输出字段分隔符,默认为空白字符,即把分隔好的$1,$2等以什么分隔输出
在这里插入图片描述
RS:输入记录分隔符,指定输入时的换行符,即以你指定的符号换行
在这里插入图片描述
ORS:输出记录分隔符,即输出时用指定的符号代替换行符
在这里插入图片描述
上面的例子先指定了以:分格换行,又指定###替代换行符


NF:每行被分隔符分隔的段数
NR:记录号,有多少行

awk 'END{print NR}' /etc/shadow   //最后一行的行号,也代表此文件一共有多少行

FILENAME:当前文件名

awk '{print FILENAME}}' /etc/fstab   //打印文件参数名,打印的次数取决于文件的行数

ARGC:命令行参数个数,通常为ack本身加上后面跟的文件数

awk '{print ARGC}’ /etc/fstab /etc/inittab  //参数为3,打印的次数为两文件的行数

ARGV:数组,保存的是命令行所给定的各参数
FNR:各文件分别计数,记录号
自定义变量

awk -v test='hello gawk' '{print test}' /etc/fstab
awk -v test='hello gawk' 'BEGIN{print test}'

在这里插入图片描述



printf命令


格式化输出:printf “FORMAT”, item1, item2, …
(1) 必须指定FORMAT
(2) 不会自动换行,需要显式给出换行控制符,\n
(3) FORMAT中需要分别为后面每个item指定格式符
格式符:与item一一对应
%c:显示字符的ASCII码
%d, %i:显示十进制整数
%e, %E:显示科学计数法数值
%f:显示为浮点数
%g, %G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身
修饰符
#[.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
- 左对齐(默认右对齐) %-15s
+ 显示数值的正负符号 %+d

下面有两个例子,用法显而易见:
在这里插入图片描述
在这里插入图片描述


操作符


比较操作符:==, !=, >, >=, <, <=
模式匹配符:
 ~:左边是否和右边匹配,包含
 !~:是否不匹配
示例:输出包含root的行,$0默认输出所有
在这里插入图片描述
输出root开头的行
在这里插入图片描述

awk -F: ‘$3==0’ /etc/passwd   //输出第三列为0的行
awk -F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd  //输出第三列大于3且小于1000的第一列

条件表达式(三目表达式)selector?if-true-expression:if-false-expression

awk -F: '{$3>=1000?usertype="Common User":usertype="SysUser";printf "%20s : %-10s\n",$1,usertype}' /etc/passwd

在这里插入图片描述
打印passwd文件中所有已/bin/bash结尾的行第一列和最后一列在这里插入图片描述

wk -F: '$NF ~ /bash$/{print $1,$NF}' /etc/passwd //也可以实现上面结果,NF表示最后一列
awk -F: '(NR>=10&&NR<=20){print NR,$1}' /etc/passwd  //打印第十行到第二十行的第一列,并编号

猜你喜欢

转载自blog.csdn.net/Real_cTo/article/details/100632981