7、gawk 编辑器

一、AWK简介

awk 是一种处理文本文件的语言,是一个强大的文本分析工具。awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk 其名起自三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

awk有3个不同版本:

  awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

gawk程序是Unix中的原始awk程序的GNU版本。gawk程序让流编辑迈上了一个新的台阶,它提供了一种编程语言而不只是编辑器命令。

在gawk编程语言中,你可以做下面的事情:

  1. 定义变量来保存数据;
  2. 使用算术和字符串操作符来处理数据;
  3. 使用结构化编程概念(比如if-then 语句和循环)来为数据处理增加处理逻辑;
  4. 通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化报告。

gawk程序的报告生成能力通常用来从大文本文件中提取数据元素,并将它们格式化成可读的报告。其中最完美的例子是格式化日志文件。在日志文件中找出错误行会很难,gawk程序可以让你从日志文件中过滤出需要的数据元素,然后你可以将其格式化,使得重要的数据更易于阅读。

二、gawk用法

gawk程序脚本用一对花括号来定义。你必须将脚本命令放到两个花括号({} )中。如果你错误地使用了圆括号来包含gawk脚本,就会得到一条类似于下面的错误提示。

$ gawk '(print "Hello World!"}'
gawk: (print "Hello World!"}
gawk: ^ syntax error
语法:
gawk [选项] '模式 { 动作 }' 输入文件
gawk [选项] -f 脚本文件 输入文件
选项:
-F fs          # 指定字段分隔符
-v var=value   # 定义变量
-f script      # 从文件读取awk脚本
-W option      # 指定兼容性选项
--dump-variables  # 输出变量到文件
--profile      # 生成性能分析文件

工作流程

  读取输入 → 按行分割 → 模式匹配 → 执行动作 → 输出结果

例子:

// 打印整个文件(类似cat)
gawk '{print}' file.txt

// 打印第一列
gawk '{print $1}' file.txt

// 使用冒号作为分隔符
gawk -F: '{print $1}' /etc/passwd

// 打印行号
gawk '{print NR, $0}' file.txt

gawk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,gawk抽取信息后,才能进行其他文本操作。完整的gawk脚本通常用来格式化文本文件中的信息。

// 匹配包含"error"的行
gawk '/error/ {print}' logfile.txt

// 匹配以"192.168"开头的行
gawk '/^192\.168/ {print}' access.log

// 忽略大小写匹配
gawk 'BEGIN{IGNORECASE=1} /error/ {print}' logfile.txt

 

三、内置变量

$0                 变量是指整条记录(整行)
$1~$n              表示当前行的第一个字段,$2表示当前行的第二个字段,...
FS                 设置字段分隔符,默认是空格,等价于命令行 -F选项
RS                 输入记录分隔符,默认是换行符
NF                 当前记录中字段的个数,即有多少列
NR                 当前记录的行号,即行号,从1开始
OFS                输出字段分隔符,默认是空格
ORS                输出记录分隔符,默认是换行符
FNR 当前文件的记录号

例子:

[root@localhost /]# vi 1
文件系统     1K-块          已用      可用    已用%    挂载点
devtmpfs 1580452         0    1580452   0% /dev
tmpfs      1597460         0    1597460   0% /dev/shm
tmpfs      1597460     9712   1587748  1% /run
tmpfs      1597460 0 1597460 0% /sys/fs/cgroup
/dev/mapper/centos-root 6486016 5148040 1337976 80% /
/dev/sda1 1038336 187648 850688 19% /boot
tmpfs     319492 8 319484 1% /run/user/42
tmpfs     319492 0 319492 0% /run/user/0
tmpfs    319492 36 319456 1% /run/user/1000
[root@localhost /]# awk '{if(NR>=3 && NR<=6)print $0}' 1
tmpfs                   1597460       0 1597460    0% /dev/shm
tmpfs                   1597460    9712 1587748    1% /run
tmpfs                   1597460       0 1597460    0% /sys/fs/cgroup
/dev/mapper/centos-root 6486016 5148040 1337976   80% /
[root@localhost /]# awk '{if(NR>=3 && NR<=6)print $1}' 1
tmpfs
tmpfs
tmpfs
/dev/mapper/centos-root
[root@localhost /]# awk '{if(NR>=3 && NR<=6)print $2}' 1
1597460
1597460
1597460
6486016

 

程序结构详解

基本结构 

BEGIN { 开始块 }   // 在处理前执行一次
模式 { 动作块 }   // 对每行处理
END { 结束块 }    // 在处理后执行一次

例子:

# 统计文件行数和单词数
gawk '
BEGIN { 
    print "开始处理文件..."
    lines = 0
    words = 0
}
{
    lines++
    words += NF  # NF是当前行的字段数
    print NR ": " $0
}
END {
    print "处理完成"
    print "总行数:", lines
    print "总单词数:", words
}' file.txt

 

posted @ 2021-11-10 08:41  chao_xiong  阅读(172)  评论(0)    收藏  举报