一. awk工具介绍
1. 相比sed用来处理一行数据,awk比较倾向将一行分成几个“字段”来处理。
2. awk命令的格式
awk 'BEGIN{} {} END{}' filename
(1)awk可以处理文件也可以读取来自前个命令的标准输出
(2)awk主要是处理每一行的字段内的数据,默认的字段分割符是空格键或tab键
(3)awk中BEGIN和END两个是可选项,BEGIN一般是用来初始化一些变量在处理文件之前执行,中间{}是每读取一行的时候都会执行,END则是处理完文件之后再执行
3. awk处理一行中每个字段都是有名称的,$0表示的是整行数据,$1表示的是第一个字段值,$2表示的是第二个字段值.....
例如字符串"root 192.168.137.254 chenguolin chenguolin"有四个字段
$0 = "root 192.168.137.254 chenguolin chenguolin"
$1 = "root"
$2 = "192.168.137.254"
$3 = "chenguolin"
$4 = "chenguolin"
4. awk几个比较重要的内置变量
(1)NF: 每一行数据总的字段数
(2)NR: 当前awk所处理的第几行数据
(3)FS: 当前的分割符,默认是空格
(4)FILENAME: 当前awk处理文件的名字
二. awk的输出
1. awk提供了两种输出print和printf
2. print的参数可以是变量,数值,字符串等等,字符串要用双引号“”括起来。printf和C语言格式输出一样,在复杂的输出格式中可以用printf。
三.awk使用举例
假设有个文件in.txt,在awk内部可以和C语言一样格式使用。
1. 输出文件的每一行
awk '{print $0}' in.txt //print会自动换行
2. 输出每一行的第二个字段
awk '{print $2}' in.txt
3. 在打印文件之前,打印一行“output the file”
awk '{BEGIN{print "output the file"} {print $0}}' in.txt
4. 在打印完文件之后,打印一行“end of the file”
awk '{print $0} END{print "end of the file"}' in.txt
5. 如果每一行的第一个字段是“root”则打印
awk '{if($1 == "root") print $0}' in.txt
6. 打印奇数行
awk '{if(NR%2 == 1) print $0}' in.txt
7. 把两个文件中对应行合并,例如
第一个文件是 第二个文件是
root chenguolin
root lab104
则希望合并成
root chenguolin
root lab104
比awk好的命令: paste -d" " file1 file2 > file3
paste命令用来合并多个文件的行,默认是tab键分割符。
8. 打印文件in.txt中每一行的当前行数,总的字段数,第一个字段和最后一个字段
awk '{print NR,NF,$1,$NF}' in.txt
9. awk处理多个文件是顺序读取文件的
file1的内容
root
root
file2的内容
chenguolin
lab104
命令: awk '{print $0}' file1 file2 > file3
输出到file3中
root
root
chenguolin
lab104
四. awk 使用位运算
1. awk内部不能使用&,^等位运算,只能使用函数
2. and(v1, v2) // v1 和 v2做&运算
lshift(val, count) // 左移count位
or(v1, v2) // 或运算