[Linux Shell学习系列十四]sed和awk-5.awk基础

Posted workingdiary

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Linux Shell学习系列十四]sed和awk-5.awk基础相关的知识,希望对你有一定的参考价值。

D29

我们可以将awk的起源追溯到sed和grep,并且经由sed和greap再追溯到ed(最初的Unix行编辑器)。接下来会发现awk和sed有很多相似之处。

 

1. awk简介

awk被设计用于文本处理,并通常被用作数据提取和报告工具的解释性程序语言。

awk为处理文件提供了更普遍的计算模型。

awk中的程序与大部分其他语言的程序不同:awk程序是数据驱动的,描述你要处理的数据及找到后要做什么;其他大部分语言则是过程化的,必须详细的描述程序每一步要做什么。

awk程序的典型示例是将数据转换成格式化的报表;

  另一个例子是由独立的数据项和数据检索程序组成的数据处理应用程序:数据项是以结构化方式记录的数据;数据检索是从文件中提取数据并形成报告的过程。

所有这些操作的关键是数据拥有某种结果,即数据要按照一定的分类方式进行归类。

awk不能处理非文本文件,比如二进制执行文件等(其需要使用类似emacs中的hexlmode等二进制编辑器)。

 

和sed类似,awk的基本功能也是搜索文件中包含某些模式的行(或其他文本单元)。当某行匹配一个模式时,awk就在那一行执行指定的操作。awk持续的用这种方式处理输入的行,直到文件结尾。

 

2. awk基本语法

awk程序由一系列awk指令组成。一个awk指令由一个模式pattern后跟一个动作action组成。动作在花括号{}内,用来与模式分离。awk指令之间通常用换行符分隔。

语法:pattern {action}

运行awk的方法有两种:

1)awk程序很短时:awk [OPTIONS] [--] program-text file ...

2)awk程序很长时,放在文件中更方便:awk [OPTION] -f program-file [--] file ...

可以看到,一个awk命令行是由选项、awk程序文件或指令、输入文件名组成的。如果没有指定输入文件名或指定为-,则从标准输入中获取输入。

常用的选项如下:

选项 用法 说明
-F -F fs 指定用于输入数据的列分隔符fs
-v -v var=value 在awk程序执行前指定一个值给value给变量var。这些变量值用于awk程序的BEGIN块。
-f -f program-file 指定一个awk程序文件,代替在命令行指定awk指令。
-- --

根据POSIX参数解析约定,此选项代表命令行选项的结束。

例如,利用这个选项可以指定以“-”开头的输入文件,否则它将被解析为一个命令行选项。 

 

3. 第一个awk命令

#awk会在输入文件info.txt的每一行上按顺序执行它的print命令
#print命令不带任何参数时,打印当前行的所有内容
$ awk { print } info.txt 
Linux - Sysadmin
Database - Oracle, mysql etc.
Security - Firewall, Network, Online Security etc.
Cool - Websites

#print命令+变量$0,$0代表当前的一整行
$ awk { print $0 } info.txt 
Linux - Sysadmin
Database - Oracle, MySQL etc.
Security - Firewall, Network, Online Security etc.
Cool - Websites

#print命令+固定字符串,则输入文件有几行,就打印几个固定字符串
$ awk { print "hello" } info.txt 
hello
hello
hello
hello

 

4. 使用awk打印指定的列

#不指定列分隔符的情况下,awk默认使用空白作为列分隔符
$ awk { print $1 } info.txt 
Linux
Database
Security
Cool

#使用-F选项指定符号-为列分隔符
$ awk -F- { print $2 } info.txt 
 Sysadmin
 Oracle, MySQL etc.
 Firewall, Network, Online Security etc.
 Websites

 

5. 从awk程序文件读取awk指令

$ cat secCol.awk
BEGIN {
        FS="-"
}
{ print $2 }

#使用-f选项指定awk程序文件 $
awk -f secCol.awk info.txt Sysadmin Oracle, MySQL etc. Firewall, Network, Online Security etc. Websites

 

6. awk的BEGIN和END块

 正常情况下,awk对每一个输入行都会执行一次awk程序代码。对于需要在awk开始处理输入文件中的文本前执行一些初始化代码时,可以定义一个BEGIN块,用于初始化FS变量(列分隔符)、打印标题、或是初始化其他全局变量。

 

7. awk中使用正则表达式

awk可以使用正则表达式来有选择地执行一个独立的代码块,但正则表达式必须放在斜线内,与sed类似,或者用操作符~/!~指定任意列或变量匹配/不匹配一个正则表达式。

#包含字符串admin的行
$ awk /admin/{ print } info.txt 
Linux - Sysadmin

$ awk -F- /admin/{ print $1 } info.txt 
Linux 

#第二列匹配-的行
$ awk $2 ~ /-/ { print $1 } info.txt 
Linux
Database
Security
Cool

 

以上是关于[Linux Shell学习系列十四]sed和awk-5.awk基础的主要内容,如果未能解决你的问题,请参考以下文章

[Linux Shell学习系列十四]sed和awk-5.awk基础

(转)Linux Shell系列教程之(十四) Shell Select教程

Linux Shell学习-sed命令详解

Linux学习笔记(二十四)管道符和作业控制shell变量环境变量配置文件

shell脚本学习笔记 (流编辑器sed)

Linux shell编程命令-Linux基础环境命令学习笔记