awk命令(文本分析)
1.概述:
-
awk命令是一种编程语言,用于在linux/unix下对文本和数据进行处理;
-
支持用户自定义函数和动态正则表达式等先进功能;
2.用法:
格式:awk [参数] [文件]
常用参数:
-
-F:指定输入时用到的字段分隔符,如分号;
-
-v:自定义变量
-
-f:从脚本中读取awk命令
1.以:号为分隔符,输出/etc/passwd的第1字段内容
[root@localhost ~]# awk -F: '{print $1}' /etc/passwd
[root@localhost ~]# awk -F: '{print $1"用户shell为:"$7}' /etc/passwd
$0:代表整行内容
2.匹配模式:关系表达式:条件为GID为996 动作:用户名称
[root@localhost ~]# awk -F: '$4==188 {print $1}' /etc/passwd
3.匹配模式:正则表达式:以test为开头的行 动作:输出用户名和组id
[root@localhost ~]# awk -F: '/^test/{print $1,$4}' /etc/passwd
4.传递变量动作:输出用户名称和组ID
[root@localhost ~]# awk -F: -va=3 '{print $1,$1+$a}' /etc/passwd
5.匹配模式:BEGIN和END语句
[root@localhost ~]# awk -F: '{print "filename:"FILENAME",linenumber:"NR",columns:"NF",linecontent:"$0}' /etc/passwd
[root@localhost ~]# awk -F: 'BEGIN{print "-------------------------\n"}{printf "username:%-16s\tsuserid:%-16s\n",$1,$4}END{printf N "%-4s records\n",NR}' /etc/passwd
* 使用-F指定分隔符,-v传递变量参数,输出时有print和printf格式化输出,并且输出多列用,号分割,并且添加BEGIN和END字段。
* BEGIN语句块是awk分析处理前做的事情;END语句块是awk分析处理后做的事情
3.模式:
-
正则表达式:使用通配符的一些扩展集;
-
关系表达式:使用运算符进行操作,可以是字符串或者数据的比较测试;
-
模式匹配表达式: ~:匹配运算符; ~!:不匹配运算符;
-
BEGIN语句块,pattern语句块,END语句块;
运算符:
-
算数运算符:+、-、*、/
-
赋值运算符:=、+=、......
-
逻辑运算符:||、&&
-
关系运算符:=、=、!=、>、<
-
正则运算符:~、~!
4.动作:
组成:由一个或多个命令、函数表达组成;之间用逗号分隔开来,并位于大括号之内
主要部分:变量、数组赋值、输出命令、控制流语句、内置函数等等
(1)内置变量:
-
NR:已读(行数)的记录数
-
NF:浏览记录域(列数)的个数
-
ARGC:命令行参数个数
-
ARGV:命令行参数排序
-
FILENAME:awk浏览的文件名称
-
FNR:浏览文件的记录数
-
FS:设置输入域分隔符,等价于命令-F选项
(2)数组:
数组使用的语法格式:array_name[index]=value
删除数组:delete array_name[index]
多维数组:
(3)条件和循环语法:
if (condition) action
if (condition) action else action
for (initialisation; condition; increment/decrement) action
while (condition) action
* break:用以结束循环
* Continue:语句用于在循环体内部结束本次循环,从而直接进入下一次循环迭代
(4)内置函数:
-
算数函数
-
字符串函数
-
时间函数
-
位操作函数
-
其它函数
参考:
AWK内置函数