Linux文本处理三剑客之awk学习笔记02:命令行和语法结构


命令行和语法结构

awk [ options ] [ -- ] program-text file ...

options即选项;program-text即awk代码;file ...即待处理的读入数据,可以是文件也可以是标准输入,只要是数据来源即可。

这里比较陌生的是[ -- ],中括号表示可以省略,在解释“--”含义之前我们先来阐述一下一个bash下命令的选项和参数。

cmd -x -u root -ppassword a.txt b.txt c.txt
  1. 选项可以有长选项和短选项,例如awk的-f和--file。
  2. 选项按照是否带有参数可以分为3种情况:
    1. 不带参数的选项。例如cat的-n选项显示行号,-n选项后面不需要(也不能)带选项参数。
    2. 必带参数的选项。例如mysql的-u选项必须带上一个用户名(mysql -u root),选项的参数是必须的。
    3. 选带参数的选项。例如mysql的-p[password]选项,如果省略了选项参数password,那么我们需要在随后的STDIN里面输入密码;否则我们就必须在选项后面立即(不能有任何空格)跟上选项参数password。
  3. 参数按照出现的位置可以分为2种情况:
    1. 选项型参数:作为选项的参数出现,例如“mysql -u root --database=XXDB”。
    2. 非选项型参数:一般表示命令的作用对象(例如文件等)或其他信息,一般处于命令的尾部或者后半部。

而前文所述的“--”用来标识选项到此结束(类似于用来标识文件结束的EOF标识),后面的字符均理解为非选项型参数(在这里即包含了awk代码和文件)。

由于选项一般都会包含中划线“-”,因此如果非选项型参数包含了这个字符,那么bash就很难理解其到底是一个选项还是一个非选项型参数。下面就是一个好的例子。

[root@c7-server ~]# grep "-v" test.txt 
^C
[root@c7-server ~]# grep -- "-v" test.txt 
abc-vabc

如果文件名包含了“-”,也可以使用该功能避免歧义。

讲完了命令行结构接下来我们来看看语法结构。由双引号包裹的awk代码中包含着诸多如下的语法结构:

pattern{action}

我们称其为规则(rule)。pattern(模式)是表达式,返回布尔值的条件判断,返回真的时候我们才执行{}中的action(动作)。action一般会对每次读入的数据进行操作,不过不是强制,纯看action是怎么写的。

awk 'BEGIN{n=3} ($4<=18){print "teen"} /Alice/{print "Alice"} END{print "hello"}' a.txt

pattern和action都可以省略,不同的省略组合搭配有不同的效果。

省略pattern:会使得每次读入的数据都满足执行action的条件。(有一些此前见过的结果或者随着博客的深入慢慢一眼就可以看出结果的,我就不再写入博客了。)

~]# awk '{print $0}' a.txt

省略{action}:等价于{print},再等价于{print $0}。

~]# awk '/Alice/' a.txt 
2   Alice   female  24   def@gmail.com  18084925203

仅省略action但是保留大括号:等价于空action,对于满足条件的数据咱啥也不干。

[root@c7-server ~]# awk '/Alice/{}' a.txt 
[root@c7-server ~]#

省略pattern+省略{action},即只剩俩单引号了:这并不会输出每次读入的数据而是啥也不干。

[root@c7-server ~]# awk '' a.txt 
[root@c7-server ~]#

rule即pattern{action}的组合可以有多个,每次读入的数据都会按照rule的出现顺序(CLI中从左往右,代码文件中从上往下)依次判断执行。同一个pattern代码块内的多个action在CLI中使用分号分隔,在代码文件中如果有换行则不需要使用分号分隔,否则需要。

pattern简述如下,而action有许许多多的指令,它们都会随着博客的深入会慢慢遇到。

# 特殊pattern
BEGIN{}
END{}

# 布尔值pattern
/REGEXP/    # 正则匹配
relational expression    # 等值比较 3>2{action}
pattern && pattern    # 逻辑与
pattern || pattern    # 逻辑或
! pattern    # 逻辑取反
(pattern)    # 优先级置顶
pattern?pattern:pattern    # 条件表达式(三目运算符)

# 非布尔值pattern
pattern1,pattern2    # 范围pattern,也称之为flip-flop