前言
AWK是一个功能强大的编辑工具,用于在Linux及Unix环境中对文本和数据进行处理。
一、awk工具
1.1 awk概述
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
AWK是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作数据可以来自标准输入也可以是管道或文件。常作为脚本来使用。
1.2 awk工具介绍
功能强大的编辑工具
无交互的情况下实现复杂的文本操作
Awk的两种语法格式:
awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2 … awk -f 脚本文件 文件 1 文件 2 …
二、awk工作原理
当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出
如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行多少次。
逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"“字段"然后再进行处理。
awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
在使用awk命令的过程中,可以使用逻辑操作符”
&&“表示"与”、“||表示"或”、"!“表示非”;还可以进行简单的数学运算,如+、一、*、/、%、^分别表示加、减、乘、除、取余和乘方。
三、awk内置变量
变量 | 描述 |
FS | 输入字段分隔符,默认为空格或制表位(tab) |
OFS | 输出字段的分割符(默认是空格) |
RS | 输入行分隔符 |
ORS | 输出行的分割符,默认为换行符 |
NF | 当前处理的行的字段个数 |
NR | 当前处理的行的行号(序数) |
FNR | 读取文件的记录行号(从1开始,若读取新的文件依旧是从1开始) |
$0 | 当前处理的行的整行内容 |
$n | 当前处理行的第n个字段(第n列) |
四、案例
4.1基础案例
awk ‘{print}’ passwd.txt 打印所有
awk ‘{print $1}’ passwd.txt #打印第一列(awk默认把这一行当做一列,因为没有被空格分隔,awk默认以空格或tab键分隔)
awk -F: ‘{print $1}’ passwd.txt 自定义冒号为分隔符显示分隔之后的第1列
awk -Fx ‘{print $1}’ passwd.txt用x作为分隔符
awk -F: ‘{print $1,$2}’ passwd.txt 打印以:为分隔符的一列,二列 $1与$2 之间的逗号代表空格
\t 表示制表符。也是tab键
awk -F[: /] ‘{print $1,$2}’ passwd.txt 定义两个分隔符,:或者/ 两个有其中一个都算作是分隔符定义两个分隔符
4.2常用变量
NF FS NR $0 $n RS的使用举例 $1:代表第一列 $2:代表第二列以此类推 $0:代表整行 NF:一行的列数 NR:行数 RS:输入行分隔符
RS:输入行分隔符
awk -F: '/root/{print $0}' passwd.txt #打印包含root的整行内容 awk -F: '/root/{print $1}' passwd.txt #打印包含root的行的第一列 awk -F: '/root/{print $1,$6}' passwd.txt #打印包含root的行的第一列和第六列 awk -F: '/\!/{print $1}' /etc/shadow #输出shadow文件中以冒号分隔的有感叹号的行的第一列 awk -F[ :/] '{print NF}' passwd.txt #打印文件每一行以:或/为分割的列数 awk -F: '{print NF,$0}' passwd.txt #打印passwd.txt文件每一行以:分割的列数及每行的内容 awk -F: '{print $NF}' passwd.txt #打印passwd.txt文件每一行以:分割的最后一列 awk '{print NR}' passwd.txt #只显示每一行行号 awk '{print NR,$0}' passwd.txt #在每行前面加上行号
awk 'END{print NR}' /etc/passwd #打印总行数 awk 'END{print $0 }' /etc/passwd #打印文件最后一行 awk -F: '{print "当前行有"NF"列"}' /etc/passwd #打印当前行以:分割的总共有几列 awk -F: '{print "第"NR"行有"NF"列" }'/etc/passwd #第几行有几列