题目来源:力扣
给定一个文件 file.txt,请打印这个文件的第十行。
Line 1Line 2Line 3Line 4Line 5Line 6Line 7Line 8Line 9Line 10
答案如下:
awk 'NR==10' file.txt
我们来看看维基百科对awk的描述:
AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。
AWK是一种处理文本文件的语言。它将文件作为记录序列处理。在一般情况下,文件内容的每行都是一个记录。每行内容都会被分割成一系列的域,因此,我们可以认为一行的第一个词为第一个域,第二个词为第二个,以此类推。AWK程序是由一些处理特定模式的语句块构成的。AWK一次可以读取一个输入行。对每个输入行,AWK解释器会判断它是否符合程序中出现的各个模式,并执行符合的模式所对应的动作。
awk的基本用法如下
awk 执行 文件名# 例如:awk '{print $0}' file.txt# 结果:Line 1Line 2Line 3Line 4Line 5Line 6Line 7Line 8Line 9Line 10# print是打印命令,$0代表当前行,那么命令就是将每一行都打印出来
awk会根据空格和制表符,将每一段分成若干段,依次用$1,$2,$3代表第一个、第二个、第三个字段
awk '{print $1}' file.txt# 结果LineLineLineLineLineLineLineLineLineLine
我们也可以指定字段分隔符,使用-F参数指定分隔符,例如:
awk -F '/' '{print $1}' file.txt# 结果Line 1Line 2Line 3Line 4Line 5Line 6Line 7Line 8Line 9Line 10
这个时候分隔符指定为’/‘ 就不是之前的空格,所以输出$1就是一整行了。
我们修改一下file.txt的内容例如
Line 1 xiaoming1 2019/08/23 11:11:21Line 2 xiaoming2 2019/08/23 11:11:20Line 3 xiaoming3 2019/08/23 11:11:19Line 4 xiaoming4 2019/08/23 11:11:18Line 5 xiaoming5 2019/08/23 11:11:17Line 6 xiaoming6 2019/08/23 11:11:16Line 7 xiaoming7 2019/08/23 11:11:15Line 8 xiaoming8 2019/08/23 11:11:14Line 9 xiaoming9 2019/08/23 11:11:13Line 10 xiaoming10 2019/08/23 11:11:12
这个时候再次执行指定分隔符操作看看
awk -F '/' '{print $1}' file.txt# 结果Line 1 xiaoming1 2019Line 2 xiaoming2 2019Line 3 xiaoming3 2019Line 4 xiaoming4 2019Line 5 xiaoming5 2019Line 6 xiaoming6 2019Line 7 xiaoming7 2019Line 8 xiaoming8 2019Line 9 xiaoming9 2019Line 10 xiaoming10 2019awk -F '/' '{print $2}' file.txt# 结果08080808080808080808
awk还可以使用一些变量
变量 NF 表示当前行有多少个字段,因此 $NF 代表最后一个字段,$(NF-1)代表倒数第二个字段。例如:
awk '{print NF}' file.txt# 结果5555555555awk '{print NF}' file.txt# 结果11:11:2111:11:2011:11:1911:11:1811:11:1711:11:1611:11:1511:11:1411:11:1311:11:12
print 命令中可以使用都好,表示输出的时候,有两个部分,以空格分隔。例如:
awk '{print $1, $2}' file.txt# 结果Line 1Line 2Line 3Line 4Line 5Line 6Line 7Line 8Line 9Line 10awk '{print $1, $(NF)}' file.txtLine 11:11:21Line 11:11:20Line 11:11:19Line 11:11:18Line 11:11:17Line 11:11:16Line 11:11:15Line 11:11:14Line 11:11:13Line 11:11:12
变量NR代表处理的是第几行。例如:
awk '{print NR}' file.txt# 结果12345678910awk '{print NR $1}' file.txt# 结果1Line2Line3Line4Line5Line6Line7Line8Line9Line10Line
print 命令中,如果需要原样输出字符,那么需要把字符放在双引号里面,例如:
awk '{print NR ":" $1}' file.txt# 结果1:Line2:Line3:Line4:Line5:Line6:Line7:Line8:Line9:Line10: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()用于字符串转换成大写,例如:```bashawk '{print toupper($0)}' file.txt# 结果LINE 1 XIAOMING1 2019/08/23 11:11:21LINE 2 XIAOMING2 2019/08/23 11:11:20LINE 3 XIAOMING3 2019/08/23 11:11:19LINE 4 XIAOMING4 2019/08/23 11:11:18LINE 5 XIAOMING5 2019/08/23 11:11:17LINE 6 XIAOMING6 2019/08/23 11:11:16LINE 7 XIAOMING7 2019/08/23 11:11:15LINE 8 XIAOMING8 2019/08/23 11:11:14LINE 9 XIAOMING9 2019/08/23 11:11:13LINE 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:21Line 10 xiaoming10 2019/08/23 11:11:12
print 命令前面是一个正则表达式,只输出包含 xiaoming1 的行
# 输出奇数行awk 'NR % 2 == 1 {print NR":" $0}' file.txt1:Line 1 xiaoming1 2019/08/23 11:11:213:Line 3 xiaoming3 2019/08/23 11:11:195:Line 5 xiaoming5 2019/08/23 11:11:177:Line 7 xiaoming7 2019/08/23 11:11:159:Line 9 xiaoming9 2019/08/23 11:11:13# 输入第三行以后的行awk 'NR > 3 {print NR":"$0}' file.txt4:Line 4 xiaoming4 2019/08/23 11:11:185:Line 5 xiaoming5 2019/08/23 11:11:176:Line 6 xiaoming6 2019/08/23 11:11:167:Line 7 xiaoming7 2019/08/23 11:11:158:Line 8 xiaoming8 2019/08/23 11:11:149:Line 9 xiaoming9 2019/08/23 11:11:1310:Line 10 xiaoming10 2019/08/23 11:11:12# 第三个字段等于xiaoming1的行awk '$3 == "xiaoming1" {print $0}' file.txtLine 1 xiaoming1 2019/08/23 11:11:21# 第三个字段等于xiaoming1或者xiaoming3的行awk '$3 == "xiaoming1" || $3 == "xiaoming3" {print $0}' file.txtLine 1 xiaoming1 2019/08/23 11:11:21Line 3 xiaoming3 2019/08/23 11:11:19
awk 提供if结构,用于复杂条件。例如
awk '{if ($2 > 3 && $NF > "11:11:15") print $0 }' file.txtLine 4 xiaoming4 2019/08/23 11:11:18Line 5 xiaoming5 2019/08/23 11:11:17Line 6 xiaoming6 2019/08/23 11:11:16awk '{if ($2 > 3 && $NF > "11:11:15") print $0; else print NR}' file.txt123Line 4 xiaoming4 2019/08/23 11:11:18Line 5 xiaoming5 2019/08/23 11:11:17Line 6 xiaoming6 2019/08/23 11:11:1678910awk '{if ($2>3&&$NF>"11:11:15")print $0;else if($NF>"11:11:15") print NR":"$1;else print NR}' file.txt1:Line2:Line3:LineLine 4 xiaoming4 2019/08/23 11:11:18Line 5 xiaoming5 2019/08/23 11:11:17Line 6 xiaoming6 2019/08/23 11:11:1678910
