[译文] linux awk指令入门


原文:https://www.geeksforgeeks.org/awk-command-unixlinux-examples/

目录
  • 简介
    • awk可以做些什么?
      • 1. awk的操作流程
      • 2. 功能
      • 3. awk编程的构成
      • 语法
      • 参数
  • 示例
    • 简单示例
    • awk的内置变量
      • 内置变量使用示例
        • NR使用示例(打印行数)
        • NF使用示例(打印最后一个字段)

简介

awk是一门脚本语言,用来操作数据并生成一份报告。awk不需要编译,用户可以使用变量,数值函数,字符串函数,还有逻辑操作。(awk可以用来直接作命令行操作,也可用来写脚本。)

awk可以用来写一些很小但是高效的程序,它以文本文件中的行作为处理单位,在每行中进行查找并对匹配到的文本模式(text pattern)执行操作。

awk是三位开发者名字的缩写-----Aho, Weinberger, and Kernighan.

awk可以做些什么?

1. awk的操作流程

  1. 逐行读取文件
  2. 把读取的每行分割成多个字段(fileld)
  3. 将字段和模式(pattern)进行匹配
  4. 对匹配到的行执行操作

2. 功能

  1. 转换文件
  2. 产生格式化的报告

3. awk编程的构成

  1. 格式化输出行
  2. 数值和字符串操作
  3. 条件和循环

语法

awk options 'selection _creteria{action}' input_file > output_file

参数

-f program_file : 
-F fs : fs是输入的作为字段的分隔符

示例

简单示例

所有的例子都使用下面的文本文件作演示,使用cat命令来如输入文本信息,ctrl+d来结束输入:

$ cat > employee.txt
ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000

1 . awk的默认行为:默认情况下awk打印文件的每一行。

  • 输入
$ awk '{print}' employee.txt 
  • 输出
ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000

在上面例子中,我们没有定义pattern。所以对每行都进行了处理。print不指定参数时,默认情况下会打印整行。

2. 打印与指定的pattern相匹配的行

  • 输入
$ awk '/manager/ {print}' employee.txt 
  • 输出
ajay manager account 45000
varun manager sales 50000
amit manager account 47000

上述例子中awk打印能查找到“manger”的行

3. 把一行切割成多个字段:默认情况下awk以空格作为分隔符,将读进来的每行分割成多个字段(fileld),并把这些字段存在变量$n中.例如一行有以空格分隔的四个单词,这四个单词会分别存在$1,$2,$3,$4中。$0存储的是整行。

  • 输入
$ awk '{print $1,$4}' employee.txt 
  • 输出
ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000
deepak 23000
sunil 13000
satvik 80000

上面的例子中,$1表示名字,$4表示工资.

awk的内置变量

$n:$0(代表整行),$1,$2,$3.一行中独立的单词或片段称为字段.

NR: Number of Records------记录数,这里的记录主要是值行,因为我们通常使用换行符来划分记录。所以大多时候NR存储了输入的行数.

NF: Number of Fields------当前行的字段数

FS: Field Separator------存储分割符,分隔符用来分隔各个字段.默认情况下分隔符是空格或tab. FS可以重新赋值为其他的字符。

RS: Record Separator------默认存储的是换行符,所以默认情况下awk对文本文件按行处理。

OFS: Output Field Separator,用来存储输出时的分隔符。

ORS: Output Field Separator,用来存储输出时的记录分隔符。

内置变量使用示例

NR使用示例(打印行数)
  • 输入
$ awk '{print NR,$0}' employee.txt 
  • 输出
1 ajay manager account 45000
2 sunil clerk account 25000
3 varun manager sales 50000
4 amit manager account 47000
5 tarun peon sales 15000
6 deepak clerk sales 23000
7 sunil peon sales 13000
8 satvik director purchase 80000

因为NR中存储的是输入的行数,$0存储的是整行,所以就有行号的效果。

  • 输入
$ awk 'NR==3, NR==6 {print NR,$0}' employee.txt 
  • 输出
3 varun manager sales 50000
4 amit manager account 47000
5 tarun peon sales 15000
6 deepak clerk sales 23000

上述指定了NR的范围[3,6]

NF使用示例(打印最后一个字段)
  • 输入
$ awk '{print $1,$NF}' employee.txt 
  • 输出
ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000
deepak 23000
sunil 13000
satvik 80000

因为NF中存储了字段数,所以此处它的值为4.$NF也就是$4