Linux三剑客指的是grepsedawk这三个命令。其中awk命令的详细用法有很多,但这里只介绍了常见用法。awk是一个强大的文本分析工具,它把文件逐行读入,以空白字符为默认分隔符将每行内容切片,切开的部分再进行各种分析处理。
awk的参数格式为awk '{pattern + action}' <filename>。其中,pattern表示在数据中要查找的内容,action表示要执行的一系列命令。且awk在处理文本的时候会自动给每行变量从1开始赋值,如$1代表文本中的第一个数据字段,$2代表文本中的第二个数据字段,以此类推。还有一个特殊的 $0代表整个文本行的内容。下面的操作都是基于hello.txt文件进行的:

[root@bigData01 ~]# cat hello.txt 
Hello world!1
Helao world!2
Hello world!3
Hello world!4
Hello world!5
Hello world!6
abc!7
  1. 输出文件第N列内容

以空格符为默认分隔符,分隔符可以修改,详见下文。

[root@bigData01 ~]# awk '{print $1}' hello.txt 
Hello
Helao
Hello
Hello
Hello
Hello
abc!7
  1. 输出文件全部内容

$0代表全部内容。

[root@bigData01 ~]# awk '{print $0}' hello.txt 
Hello world!1
Helao world!2
Hello world!3
Hello world!4
Hello world!5
Hello world!6
abc!7
  1. 指定分隔符

使用-F参数指定分隔符为!

[root@bigData01 ~]# awk -F ! '{print $2}' hello.txt 
1
2
3
4
5
6
7
  1. 匹配正则表达式

匹配正则表达式时,参数格式为awk '/正则表达式/ {操作} <文件>'
下述代码中^a代表匹配以a开头的字符。

[root@bigData01 ~]# awk '/^a/ {print $0}' hello.txt 
abc!7
[root@bigData01 ~]# awk -F ! '/^a/ {print $2}' hello.txt 
7
  1. 指定列匹配

参数格式为awk '($n~/正则表达式/) {操作} <文件>',其中$n表示要匹配的列。例如:
awk '($1~/^a/) {print $0}' hello.txt 表示匹配第一列中以a开头的字符串,并输出整行;
awk -F ! '($1~/^a/) {print $2}' hello.txt 表示匹配第一列中以a开头的字符串,并输出第二列(以!为分隔符)。
awk -F ! '($1!~/^a/) {print $2}' hello.txt表示匹配第二列中以a开头的字符串,并输出第二列(以!为分隔符)。
awk -F ! '($1!~/^a/) {print $2}' hello.txt表示匹配第一列中不以a开头的字符串,并输出第二列(以!为分隔符)。

[root@bigData01 ~]# awk '($1~/^a/) {print $0}' hello.txt 
abc!7
[root@bigData01 ~]# awk -F ! '($1~/^a/) {print $2}' hello.txt 
7
[root@bigData01 ~]# awk -F ! '($2~/^a/) {print $0}' hello.txt
[root@bigData01 ~]# awk -F ! '($1!~/^a/) {print $2}' hello.txt 
1
2
3
4
5
6