awk 是常用的 Linux 文本操作命令和脚本语言。用来按行提取和处理文本内容,也可以执行简单的逻辑处理。

比如我们有一个 txt 文件:

ab.c 123 e.rt 456
oh.g 324 b.na 756
si.d 156 o.ui 452

执行命令:

$ awk '{print $1}' test.txt
ab.c
oh.g
si.d

可以看到返回结果为每一行的第一个字符串。默认以空格作为分隔符。

$1 为每行第一个字符串,$2 为每行第二个字符串,以此类推。$0 为整个文本。

可以同时输出多个内容:

$ awk '{print $1, $2}' test.txt
ab.c 123
oh.g 324
si.d 156

内部集成的参数

FS 区域分割符

awk 默认使用空格来分割字符串,也可以自己定义分割符:

$ awk 'FS = "." {print $1, $2}' test.txt
ab c 123 e
oh g 324 b
si d 156 o

这时候,abc 123 e 分别是一个整体。

还有一种写法使用 -F 表示,要写在引号外部:

$ awk -F. '{print $1, $2}' test.txt

NF 每行字符串个数

$NF 来表示每行最后一个串:

$ awk '{print $NF}' test.txt
456
756
452

用 NF 来判断每行字符串格个数:只输出有 4 个字符串的所在行的内容

$ awk 'NF == 4 {print $1, $2}' test.txt
ab.c 123
oh.g 324
si.d 156

NR 当前行号

NR 记录当前行的行号:

$ awk '{print NR}' test.txt
1
2
3
$ awk '{print NR, $0}' test.txt
1 ab.c 123 e.rt 456
2 oh.g 324 b.na 756
3 si.d 156 o.ui 452

OFS 定义输出串分割符

字符串输出是可以自定义分割符号:

$ awk 'OFS="/" {print $1, $2}' test.txt
ab.c/123
oh.g/324
si.d/156

BEGIN 和 END 规则

BEGIN 规则是在 awk 读取输入文本前执行的指令,END 规则是在 awk 输出完字符串后执行的指令。

$ awk 'BEGIN {print "begin process"} {print $0} END {print "end process"}' test.txt
begin process
ab.c 123 e.rt 456
oh.g 324 b.na 756
si.d 156 o.ui 452
end process

判断模块

可以使用常用的判断来过滤输出结果:

设置第4个字符串数字需要大于等于500:

$ awk '$4 >=500 {print $0}' test.txt
oh.g 324 b.na 756

设置行内必须包含字符串 ab:

$ awk '/ab/ {print $0}' test.txt
ab.c 123 e.rt 456

设置行开始必须包含字符串 ab:

$ awk '/^ab/ {print $0}' test.txt
ab.c 123 e.rt 456

如果必须包含的是特殊字符需要加转义符\

$ awk '/\./ {print $0}' test.txt

使用 if 命令判断:

awk '/\./ {if($2 != "abc") {print $1}}' test.txt

使用 xargs 调用 awk 输出内容

使用 xargs 可以将 awk 的内容逐行作为 stdin 传递给其他命令使用。

例如:

awk '{print $0}' test.txt | xargs echo

以上会将 awk 过滤输出的内容通过 xargs 命令逐行传递给 echo 作为 stdin 信息使用。

awk script 脚本

如果命令很复杂,可以建立一个脚本来单独执行。

建立文件:test.awk

#!/usr/bin/awk -f

BEGIN {
  # set the input and output field separators
  FS=":"
  OFS=":"
  # zero the accounts counter
  accounts=0
}
{
  # set field 2 to nothing
  $2=""
  # print the entire line
  print $0
  # count another account
  accounts++
}
END {
  # print the results
  print accounts " accounts.\n"
}

可执行权限:

chmod +x test.awk

执行:

./test.awk /etc/passwd

windows

windows 下也可以使用 awk,下载安装 Gawk 即可。

官网:http://gnuwin32.sourceforge.net/packages/gawk.htm

下载对应安装包,安装后将 awk 可执行文件的路径加入系统 PATH 即可使用,参考:https://blog.niekun.net/archives/413.html

参考链接

https://www.howtogeek.com/562941/how-to-use-the-awk-command-on-linux/
http://linuxcommand.org/lc3_adv_awk.php

标签:无

1 条评论

  1. ahxinny ahxinny

    这个好!对处理文件数据有用

你的评论