作用:文本处理工具.
命令格式
awk Options 'Program-Text' InputFile1 InputFile2 ...
对输入文件 InputFile1 InputFile2 … 执行给定的程序 Program-Text.
常用选项
-F sep
: 自定义字段分隔符为 sep.-f ScriptFile
: 从 ScriptFile 文件中读取 awk 脚本.
记录
默认的记录分隔符为换行符.
可以通过内建变量 RS
来自定义记录分隔符. RS
的值可以是单个字符,也可以是正则表达式.
如果将 RS
设为空字符串,则 awk 将以空白行来分割记录,且以换行符作为字段分隔符.
字段
awk 将每个记录分割为多个字段.
默认的字段分隔符是任意的空白符. 可以通过 -F
选项或 FS
内建变量来自定义字段分隔符.
FS
的值可以是单个字符,也可以是正则表达式.
如果 FIELDWIDTHS
变量被设置为以空格分隔的一系列数字,则每个字段将有对应数量的字符. 此时忽略 FS
.
如果 FPAT
变量被设置为一个正则表达式,则每个字段将是匹配该正则的内容. FPAT
的优先级最低.
$0
代表整个记录、$1
代表记录中的第1个字段、$2
代表第2个字段、$11
代表第11个字段 … ($
只用于引用字段,使用变量时,直接使用变量名即可)
NF
变量的值是当前记录中的字段数.
模式
Program-Text 为:
pattern {action1; action2; ...}
如果匹配模式,则执行指定的动作.
pattern 可以省略,此时将对每个记录执行给定的动作.
pattern 可以取值如下:
-
BEGIN
: 在读取输入之前执行. -
END
: 在处理完所有输入之后执行. -
BEGINFILE
: 在读取每个输入文件之前执行. -
ENDFILE
: 在处理完每个文件之后执行. -
/regular expression/
: 只要记录匹配给定的正则表达式就执行. -
模式也支持逻辑运算:
pattern && pattern pattern || pattern !pattern
-
pattern1, pattern2
: 从匹配第一个模式的地方开始至匹配第二个模式的地方结束,包括首尾. -
$n ~ /pattern/
: 只要第 n 个字段匹配指定的模式就执行. -
$n !~ /pattern/
: 只要第 n 个字段不匹配指定的模式就执行.
例子
[ming@localhost test]$ cat /etc/passwd | head -3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[ming@localhost test]$ awk -F : '{print $1}' /etc/passwd | head -3
root
bin
daemon
[ming@localhost test]$ cat script.awk
BEGIN {
print "Start Processing ..."
}
BEGINFILE {
printf "Start Processing %s ...\n", FILENAME
}
{
print $1
}
ENDFILE {
printf "Finish Processing %s!\n", FILENAME
}
END {
print "Finish Processing!"
}
[ming@localhost test]$ cat data1.txt
1 2 3 4 5 6 7 8 9 10 11
a b c d e f g h i j k
[ming@localhost test]$ cat data2.txt
1 2 3 4 5 6 7 8 9 10 11
a b c d e f g h i j k
[ming@localhost test]$ awk -f script.awk data1.txt data2.txt
Start Processing ...
Start Processing data1.txt ...
1
a
Finish Processing data1.txt!
Start Processing data2.txt ...
1
a
Finish Processing data2.txt!
Finish Processing!
注意:模式必须和 {
位于同一行.
使用正则表达式:
[ming@localhost test]$ awk '/[a-z]/{print $1}' data1.txt
a
[ming@localhost test]$ awk '!/[a-z]/{print $1}' data1.txt
1
逻辑运算:
[ming@localhost test]$ cat data.txt
1 2 3 4 5 6 7 8 9 10 11
a b c d e f g h i j k
10 a 20 b 30 c
[ming@localhost test]$ awk '$1 ~ /[0-9]/ && $2 !~ /[0-9]/{print $1}' data.txt
10