题目来源:力扣
给定一个文件 file.txt,请打印这个文件的第十行。

  1. Line 1
  2. Line 2
  3. Line 3
  4. Line 4
  5. Line 5
  6. Line 6
  7. Line 7
  8. Line 8
  9. Line 9
  10. Line 10

答案如下:

  1. awk 'NR==10' file.txt

我们来看看维基百科对awk的描述:
AWK是一种优良的文本处理工具,LinuxUnix环境中现有的功能最强大的数据处理引擎之一。
AWK是一种处理文本文件的语言。它将文件作为记录序列处理。在一般情况下,文件内容的每行都是一个记录。每行内容都会被分割成一系列的域,因此,我们可以认为一行的第一个词为第一个域,第二个词为第二个,以此类推。AWK程序是由一些处理特定模式的语句块构成的。AWK一次可以读取一个输入行。对每个输入行,AWK解释器会判断它是否符合程序中出现的各个模式,并执行符合的模式所对应的动作。

awk的基本用法如下

  1. awk 执行 文件名
  2. # 例如:
  3. awk '{print $0}' file.txt
  4. # 结果:
  5. Line 1
  6. Line 2
  7. Line 3
  8. Line 4
  9. Line 5
  10. Line 6
  11. Line 7
  12. Line 8
  13. Line 9
  14. Line 10
  15. # print是打印命令,$0代表当前行,那么命令就是将每一行都打印出来

awk会根据空格和制表符,将每一段分成若干段,依次用$1,$2,$3代表第一个、第二个、第三个字段

  1. awk '{print $1}' file.txt
  2. # 结果
  3. Line
  4. Line
  5. Line
  6. Line
  7. Line
  8. Line
  9. Line
  10. Line
  11. Line
  12. Line

我们也可以指定字段分隔符,使用-F参数指定分隔符,例如:

  1. awk -F '/' '{print $1}' file.txt
  2. # 结果
  3. Line 1
  4. Line 2
  5. Line 3
  6. Line 4
  7. Line 5
  8. Line 6
  9. Line 7
  10. Line 8
  11. Line 9
  12. Line 10

这个时候分隔符指定为’/‘ 就不是之前的空格,所以输出$1就是一整行了。
我们修改一下file.txt的内容例如

  1. Line 1 xiaoming1 2019/08/23 11:11:21
  2. Line 2 xiaoming2 2019/08/23 11:11:20
  3. Line 3 xiaoming3 2019/08/23 11:11:19
  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

这个时候再次执行指定分隔符操作看看

  1. awk -F '/' '{print $1}' file.txt
  2. # 结果
  3. Line 1 xiaoming1 2019
  4. Line 2 xiaoming2 2019
  5. Line 3 xiaoming3 2019
  6. Line 4 xiaoming4 2019
  7. Line 5 xiaoming5 2019
  8. Line 6 xiaoming6 2019
  9. Line 7 xiaoming7 2019
  10. Line 8 xiaoming8 2019
  11. Line 9 xiaoming9 2019
  12. Line 10 xiaoming10 2019
  13. awk -F '/' '{print $2}' file.txt
  14. # 结果
  15. 08
  16. 08
  17. 08
  18. 08
  19. 08
  20. 08
  21. 08
  22. 08
  23. 08
  24. 08

awk还可以使用一些变量

  1. 变量 NF 表示当前行有多少个字段,因此 $NF 代表最后一个字段,$(NF-1)代表倒数第二个字段。例如:

    1. awk '{print NF}' file.txt
    2. # 结果
    3. 5
    4. 5
    5. 5
    6. 5
    7. 5
    8. 5
    9. 5
    10. 5
    11. 5
    12. 5
    13. awk '{print NF}' file.txt
    14. # 结果
    15. 11:11:21
    16. 11:11:20
    17. 11:11:19
    18. 11:11:18
    19. 11:11:17
    20. 11:11:16
    21. 11:11:15
    22. 11:11:14
    23. 11:11:13
    24. 11:11:12
  2. print 命令中可以使用都好,表示输出的时候,有两个部分,以空格分隔。例如:

    1. awk '{print $1, $2}' file.txt
    2. # 结果
    3. Line 1
    4. Line 2
    5. Line 3
    6. Line 4
    7. Line 5
    8. Line 6
    9. Line 7
    10. Line 8
    11. Line 9
    12. Line 10
    13. awk '{print $1, $(NF)}' file.txt
    14. Line 11:11:21
    15. Line 11:11:20
    16. Line 11:11:19
    17. Line 11:11:18
    18. Line 11:11:17
    19. Line 11:11:16
    20. Line 11:11:15
    21. Line 11:11:14
    22. Line 11:11:13
    23. Line 11:11:12
  3. 变量NR代表处理的是第几行。例如:

    1. awk '{print NR}' file.txt
    2. # 结果
    3. 1
    4. 2
    5. 3
    6. 4
    7. 5
    8. 6
    9. 7
    10. 8
    11. 9
    12. 10
    13. awk '{print NR $1}' file.txt
    14. # 结果
    15. 1Line
    16. 2Line
    17. 3Line
    18. 4Line
    19. 5Line
    20. 6Line
    21. 7Line
    22. 8Line
    23. 9Line
    24. 10Line
  4. print 命令中,如果需要原样输出字符,那么需要把字符放在双引号里面,例如:

    1. awk '{print NR ":" $1}' file.txt
    2. # 结果
    3. 1:Line
    4. 2:Line
    5. 3:Line
    6. 4:Line
    7. 5:Line
    8. 6:Line
    9. 7:Line
    10. 8:Line
    11. 9:Line
    12. 10:Line
  5. 其它的awk的内置变量

    1. FILENAME:当前文件名
    2. FS:字段分隔符,默认是空格和制表符。
    3. RS:行分隔符,用于分割每一行,默认是换行符。
    4. OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
    5. ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
    6. 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

  1. 6. 一些处理数据的函数
  2. toupper()用于字符串转换成大写,例如:
  3. ```bash
  4. awk '{print toupper($0)}' file.txt
  5. # 结果
  6. LINE 1 XIAOMING1 2019/08/23 11:11:21
  7. LINE 2 XIAOMING2 2019/08/23 11:11:20
  8. LINE 3 XIAOMING3 2019/08/23 11:11:19
  9. LINE 4 XIAOMING4 2019/08/23 11:11:18
  10. LINE 5 XIAOMING5 2019/08/23 11:11:17
  11. LINE 6 XIAOMING6 2019/08/23 11:11:16
  12. LINE 7 XIAOMING7 2019/08/23 11:11:15
  13. LINE 8 XIAOMING8 2019/08/23 11:11:14
  14. LINE 9 XIAOMING9 2019/08/23 11:11:13
  15. LINE 10 XIAOMING10 2019/08/23 11:11:12

其他一些函数如下:

  1. tolower():字符转为小写。
  2. length():返回字符串长度。
  3. substr():返回子字符串。
  4. sin():正弦。
  5. cos():余弦。
  6. sqrt():平方根。
  7. rand():随机数。

awk 指定条件,输出符合条件的行

  1. awk '条件 动作' 文件名

例如:

  1. awk '/xiaoming1/ {print $0}' file.txt
  2. # 结果
  3. Line 1 xiaoming1 2019/08/23 11:11:21
  4. Line 10 xiaoming10 2019/08/23 11:11:12

print 命令前面是一个正则表达式,只输出包含 xiaoming1 的行

  1. # 输出奇数行
  2. awk 'NR % 2 == 1 {print NR":" $0}' file.txt
  3. 1:Line 1 xiaoming1 2019/08/23 11:11:21
  4. 3:Line 3 xiaoming3 2019/08/23 11:11:19
  5. 5:Line 5 xiaoming5 2019/08/23 11:11:17
  6. 7:Line 7 xiaoming7 2019/08/23 11:11:15
  7. 9:Line 9 xiaoming9 2019/08/23 11:11:13
  8. # 输入第三行以后的行
  9. awk 'NR > 3 {print NR":"$0}' file.txt
  10. 4:Line 4 xiaoming4 2019/08/23 11:11:18
  11. 5:Line 5 xiaoming5 2019/08/23 11:11:17
  12. 6:Line 6 xiaoming6 2019/08/23 11:11:16
  13. 7:Line 7 xiaoming7 2019/08/23 11:11:15
  14. 8:Line 8 xiaoming8 2019/08/23 11:11:14
  15. 9:Line 9 xiaoming9 2019/08/23 11:11:13
  16. 10:Line 10 xiaoming10 2019/08/23 11:11:12
  17. # 第三个字段等于xiaoming1的行
  18. awk '$3 == "xiaoming1" {print $0}' file.txt
  19. Line 1 xiaoming1 2019/08/23 11:11:21
  20. # 第三个字段等于xiaoming1或者xiaoming3的行
  21. awk '$3 == "xiaoming1" || $3 == "xiaoming3" {print $0}' file.txt
  22. Line 1 xiaoming1 2019/08/23 11:11:21
  23. Line 3 xiaoming3 2019/08/23 11:11:19

awk 提供if结构,用于复杂条件。例如

  1. awk '{if ($2 > 3 && $NF > "11:11:15") print $0 }' file.txt
  2. Line 4 xiaoming4 2019/08/23 11:11:18
  3. Line 5 xiaoming5 2019/08/23 11:11:17
  4. Line 6 xiaoming6 2019/08/23 11:11:16
  5. awk '{if ($2 > 3 && $NF > "11:11:15") print $0; else print NR}' file.txt
  6. 1
  7. 2
  8. 3
  9. Line 4 xiaoming4 2019/08/23 11:11:18
  10. Line 5 xiaoming5 2019/08/23 11:11:17
  11. Line 6 xiaoming6 2019/08/23 11:11:16
  12. 7
  13. 8
  14. 9
  15. 10
  16. awk '{if ($2>3&&$NF>"11:11:15")print $0;else if($NF>"11:11:15") print NR":"$1;else print NR}' file.txt
  17. 1:Line
  18. 2:Line
  19. 3:Line
  20. Line 4 xiaoming4 2019/08/23 11:11:18
  21. Line 5 xiaoming5 2019/08/23 11:11:17
  22. Line 6 xiaoming6 2019/08/23 11:11:16
  23. 7
  24. 8
  25. 9
  26. 10

参考http://www.ruanyifeng.com/blog/2018/11/awk.html