Linux三剑客指的是grep
、sed
、awk
这三个命令。其中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
- 输出文件第N列内容
以空格符为默认分隔符,分隔符可以修改,详见下文。
[root@bigData01 ~]# awk '{print $1}' hello.txt
Hello
Helao
Hello
Hello
Hello
Hello
abc!7
- 输出文件全部内容
$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
- 指定分隔符
使用
-F
参数指定分隔符为!
。
[root@bigData01 ~]# awk -F ! '{print $2}' hello.txt
1
2
3
4
5
6
7
- 匹配正则表达式
匹配正则表达式时,参数格式为
awk '/正则表达式/ {操作} <文件>'
。
下述代码中^a
代表匹配以a开头的字符。
[root@bigData01 ~]# awk '/^a/ {print $0}' hello.txt
abc!7
[root@bigData01 ~]# awk -F ! '/^a/ {print $2}' hello.txt
7
- 指定列匹配
参数格式为
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