一. 命令awk简介html
1. awk是一种编程语言,用于对文本和数据进行处理的shell
2. 具备强大的文本格式化能力express
3. 利用命令awk,能够将一些文本整理成为咱们想要的样子编程
4. 命令awk是逐行进行处理的数组
二. grep、sed、awk的简单比较bash
1. 命令grep,更适合单纯的查找或匹配文本app
2. 命令sed,更适合对匹配到的文本进行编辑编程语言
3. 命令awk,更适合文本格式化,对文本进行较复杂的格式处理函数
一、awk 中预先定义好的,内置在 awk 内部的变量。
ui
变量名 描述
FS 输入字段分隔符,默认是空格
OFS 输出字段分隔符,默认是空格
RS 输入记录分隔符,默认换行符
ORS 输出记录分隔符,默认换行符
NF number of fields,当前记录中域的个数,也就是每行有多少列
NR number of rows,已经读出的记录数,也就是行号。从1开始,有多个文件时,这个值会累加
FNR 各个文件分别计数的行号
FILENAME 当前文件名
AGRC 命令行参数的个数
ARGV 数组,保存命令行所传的各个参数复制代码
4、记录
复制代码
# 输出 test.txt 文件中的全部记录
awk '{print $0}' test.txt 复制代码
# 输出 test.txt 中的全部记录,并在记录前显示行号
awk '{print NR, $0}' test.txt复制代码
5、域
# 打印第一和第三个以空格分开的列(域)
awk '{print $1, $3}' test.txt复制代码
6、awk语法格式
awk [options] 'pattern{action}' file复制代码
# $3 == 0:是 pattern
# print $0:是 action
awk '$3==0 {print $0}' employee # 若是第三个域等于 0,则将这行打印 复制代码
{print $0}
(打印整行)。awk '$3 == 0' employee 复制代码
#将结果重定向到文件
awk '$3 == 0' employee > other.txt复制代码
7、域分隔符
# 指定 : 做为分隔符
awk -F: '{print $1, $3}' test.txt
# 显示指定空格做为分隔符
awk -F'[ ]' '{print $1, $3}' test.txt
# 指定空格、冒号、tab 做为分隔符
awk -F'[:\t ]' '{print $1, $3}' test.txt
# 指定以逗号(,)做为分隔符
awk -F, '{print $1, $2}' separator.txt
# 使用 -v 选项对内建变量设置分隔符,和 awk -F, 效果同样
awk -v FS=',' '{print $1, $2}' separator.txt复制代码
# 对内建变量 OFS 赋值
awk -v OFS="->" '{print $1, $2, $3}' other.txt复制代码
输出如: Beth->4.00->0 Dan->3.75->0
# 同时指定输入和输出分隔符
awk -v FS=',' -v OFS='->' '{print $1, $2}' separator.txt复制代码
8、模式-Pattern
1.根据前面的一些例子,awk 的语法以下
awk [options] 'Pattern {Action}' file1 file2
options(选项): 如前面使用过的 -v -F
Action(动做):如 print 复制代码
2.Pattern:也就是条件,一个关系表达式,awk 会逐行处理文本,处理完当前行,而后再 处理下一行。若是不指定任何的「条件」,awk 会一行一行的处理完文件的每一行,若是 指定了「条件」,只处理知足条件的行。这即 awk 中的模式。
# 将有四列的行打印出来
awk 'NF == 4 {print $0}' column.txt
# 没有指定模式则是空模式,空模式会匹配文本中每一行,每一行都知足条件
awk '{print $0}' test.txt复制代码
# 将包含 in 的记录行进行打印
awk '/in/ {print $0}' pattern.txt复制代码
# 从第一行 到 正则匹配到的第一行 之间的全部行进行打印
awk 'NR == 1, /in/{print $0}' pattern.txt
# /xx/ 没有匹配到第二个模式,打印第一个模式出现的行到文本末尾
awk 'NR == 1, /xx/{print NR, $0}' pattern.txt复制代码
结果 # 将第一行 到 正则匹配到的第一行中的 in 替换为 on(从记录行的左边开始,只替换一次)
# 怎么理解这个 1 呢?
# 这里有两个模式,awk 读出每行记录都会通过这两个模式的判断
# 1 表示这个模式为真,没有指定模式默认的 action 就是打印整行
awk 'NR == 1,/in/{sub(/in/, "on")} 1' pattern.txt复制代码
结果9、awk 内建函数
sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)复制代码
# 将每行第一次出现的域 hello 替换为 hi,每行只会匹配替换一次
awk '{sub(/hello/, "hi"); print}' test.txt
# 对每行的第一个域进行替换
awk '{sub(/hello/, "hi", $1); print}' test.txt复制代码
参考: