题目来源:力扣
给定一个文件 file.txt,请打印这个文件的第十行。
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
答案如下:
awk 'NR==10' file.txt
我们来看看维基百科对awk的描述:
AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。
AWK是一种处理文本文件的语言。它将文件作为记录序列处理。在一般情况下,文件内容的每行都是一个记录。每行内容都会被分割成一系列的域,因此,我们可以认为一行的第一个词为第一个域,第二个词为第二个,以此类推。AWK程序是由一些处理特定模式的语句块构成的。AWK一次可以读取一个输入行。对每个输入行,AWK解释器会判断它是否符合程序中出现的各个模式,并执行符合的模式所对应的动作。
awk的基本用法如下
awk 执行 文件名
# 例如:
awk '{print $0}' file.txt
# 结果:
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
# print是打印命令,$0代表当前行,那么命令就是将每一行都打印出来
awk会根据空格和制表符,将每一段分成若干段,依次用$1,$2,$3代表第一个、第二个、第三个字段
awk '{print $1}' file.txt
# 结果
Line
Line
Line
Line
Line
Line
Line
Line
Line
Line
我们也可以指定字段分隔符,使用-F参数指定分隔符,例如:
awk -F '/' '{print $1}' file.txt
# 结果
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
这个时候分隔符指定为’/‘ 就不是之前的空格,所以输出$1就是一整行了。
我们修改一下file.txt的内容例如
Line 1 xiaoming1 2019/08/23 11:11:21
Line 2 xiaoming2 2019/08/23 11:11:20
Line 3 xiaoming3 2019/08/23 11:11:19
Line 4 xiaoming4 2019/08/23 11:11:18
Line 5 xiaoming5 2019/08/23 11:11:17
Line 6 xiaoming6 2019/08/23 11:11:16
Line 7 xiaoming7 2019/08/23 11:11:15
Line 8 xiaoming8 2019/08/23 11:11:14
Line 9 xiaoming9 2019/08/23 11:11:13
Line 10 xiaoming10 2019/08/23 11:11:12
这个时候再次执行指定分隔符操作看看
awk -F '/' '{print $1}' file.txt
# 结果
Line 1 xiaoming1 2019
Line 2 xiaoming2 2019
Line 3 xiaoming3 2019
Line 4 xiaoming4 2019
Line 5 xiaoming5 2019
Line 6 xiaoming6 2019
Line 7 xiaoming7 2019
Line 8 xiaoming8 2019
Line 9 xiaoming9 2019
Line 10 xiaoming10 2019
awk -F '/' '{print $2}' file.txt
# 结果
08
08
08
08
08
08
08
08
08
08
awk还可以使用一些变量
变量 NF 表示当前行有多少个字段,因此 $NF 代表最后一个字段,$(NF-1)代表倒数第二个字段。例如:
awk '{print NF}' file.txt
# 结果
5
5
5
5
5
5
5
5
5
5
awk '{print NF}' file.txt
# 结果
11:11:21
11:11:20
11:11:19
11:11:18
11:11:17
11:11:16
11:11:15
11:11:14
11:11:13
11:11:12
print 命令中可以使用都好,表示输出的时候,有两个部分,以空格分隔。例如:
awk '{print $1, $2}' file.txt
# 结果
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
awk '{print $1, $(NF)}' file.txt
Line 11:11:21
Line 11:11:20
Line 11:11:19
Line 11:11:18
Line 11:11:17
Line 11:11:16
Line 11:11:15
Line 11:11:14
Line 11:11:13
Line 11:11:12
变量NR代表处理的是第几行。例如:
awk '{print NR}' file.txt
# 结果
1
2
3
4
5
6
7
8
9
10
awk '{print NR $1}' file.txt
# 结果
1Line
2Line
3Line
4Line
5Line
6Line
7Line
8Line
9Line
10Line
print 命令中,如果需要原样输出字符,那么需要把字符放在双引号里面,例如:
awk '{print NR ":" $1}' file.txt
# 结果
1:Line
2:Line
3:Line
4:Line
5:Line
6:Line
7:Line
8:Line
9:Line
10:Line
其它的awk的内置变量
FILENAME:当前文件名
FS:字段分隔符,默认是空格和制表符。
RS:行分隔符,用于分割每一行,默认是换行符。
OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
OFMT:数字输出的格式,默认为%.6g。
例子如下: ```bash awk ‘{print FILENAME}’ file.txt
结果
./ceshi.txt ./ceshi.txt ./ceshi.txt ./ceshi.txt ./ceshi.txt ./ceshi.txt ./ceshi.txt ./ceshi.txt ./ceshi.txt ./ceshi.txt awk ‘{print FS}’ file.txt
awk ‘{print OFMT}’ ./ceshi.txt %.6g %.6g %.6g %.6g %.6g %.6g %.6g %.6g %.6g %.6g
6. 一些处理数据的函数
toupper()用于字符串转换成大写,例如:
```bash
awk '{print toupper($0)}' file.txt
# 结果
LINE 1 XIAOMING1 2019/08/23 11:11:21
LINE 2 XIAOMING2 2019/08/23 11:11:20
LINE 3 XIAOMING3 2019/08/23 11:11:19
LINE 4 XIAOMING4 2019/08/23 11:11:18
LINE 5 XIAOMING5 2019/08/23 11:11:17
LINE 6 XIAOMING6 2019/08/23 11:11:16
LINE 7 XIAOMING7 2019/08/23 11:11:15
LINE 8 XIAOMING8 2019/08/23 11:11:14
LINE 9 XIAOMING9 2019/08/23 11:11:13
LINE 10 XIAOMING10 2019/08/23 11:11:12
其他一些函数如下:
tolower():字符转为小写。
length():返回字符串长度。
substr():返回子字符串。
sin():正弦。
cos():余弦。
sqrt():平方根。
rand():随机数。
awk 指定条件,输出符合条件的行
awk '条件 动作' 文件名
例如:
awk '/xiaoming1/ {print $0}' file.txt
# 结果
Line 1 xiaoming1 2019/08/23 11:11:21
Line 10 xiaoming10 2019/08/23 11:11:12
print 命令前面是一个正则表达式,只输出包含 xiaoming1 的行
# 输出奇数行
awk 'NR % 2 == 1 {print NR":" $0}' file.txt
1:Line 1 xiaoming1 2019/08/23 11:11:21
3:Line 3 xiaoming3 2019/08/23 11:11:19
5:Line 5 xiaoming5 2019/08/23 11:11:17
7:Line 7 xiaoming7 2019/08/23 11:11:15
9:Line 9 xiaoming9 2019/08/23 11:11:13
# 输入第三行以后的行
awk 'NR > 3 {print NR":"$0}' file.txt
4:Line 4 xiaoming4 2019/08/23 11:11:18
5:Line 5 xiaoming5 2019/08/23 11:11:17
6:Line 6 xiaoming6 2019/08/23 11:11:16
7:Line 7 xiaoming7 2019/08/23 11:11:15
8:Line 8 xiaoming8 2019/08/23 11:11:14
9:Line 9 xiaoming9 2019/08/23 11:11:13
10:Line 10 xiaoming10 2019/08/23 11:11:12
# 第三个字段等于xiaoming1的行
awk '$3 == "xiaoming1" {print $0}' file.txt
Line 1 xiaoming1 2019/08/23 11:11:21
# 第三个字段等于xiaoming1或者xiaoming3的行
awk '$3 == "xiaoming1" || $3 == "xiaoming3" {print $0}' file.txt
Line 1 xiaoming1 2019/08/23 11:11:21
Line 3 xiaoming3 2019/08/23 11:11:19
awk 提供if结构,用于复杂条件。例如
awk '{if ($2 > 3 && $NF > "11:11:15") print $0 }' file.txt
Line 4 xiaoming4 2019/08/23 11:11:18
Line 5 xiaoming5 2019/08/23 11:11:17
Line 6 xiaoming6 2019/08/23 11:11:16
awk '{if ($2 > 3 && $NF > "11:11:15") print $0; else print NR}' file.txt
1
2
3
Line 4 xiaoming4 2019/08/23 11:11:18
Line 5 xiaoming5 2019/08/23 11:11:17
Line 6 xiaoming6 2019/08/23 11:11:16
7
8
9
10
awk '{if ($2>3&&$NF>"11:11:15")print $0;else if($NF>"11:11:15") print NR":"$1;else print NR}' file.txt
1:Line
2:Line
3:Line
Line 4 xiaoming4 2019/08/23 11:11:18
Line 5 xiaoming5 2019/08/23 11:11:17
Line 6 xiaoming6 2019/08/23 11:11:16
7
8
9
10