-
定义
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。 -
有三种方式调用awk
1.命令行方式 awk [-F field-separator] 'commands' input-file(s) 其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。 2.shell脚本方式 将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。 相当于shell脚本首行的:#!/bin/sh 可以换成:#!/bin/awk 3.将所有的awk命令插入一个单独文件,然后调用: awk -f awk-script-file input-file(s) 其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
-
例子
1、demo.txt是awk所要处理的文本文件。前面单引号内部有一个大括号,里面就是每一行的处理动作print $0
# 格式 $ awk 动作 文件名 # 示例 $ awk '{print $0}' demo.txt
2、我们先用标准输入(stdin)演示上面这个例子
$ echo 'this is a test' | awk '{print $0}' this is a test
3、awk会根据空格和制表符,将每一行分成若干字段,依次用$1、$2、$3代表第一个字段、第二个字段、第三个字段等等
$ echo 'this is a test' | awk '{print $3}' a
4、字段分隔符是冒号(:),所以要用-F参数指定分隔符为冒号。然后,才能提取到它的第一个字段
root:x:0:0:root:/root:/usr/bin/zsh daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync $ awk -F ':' '{ print $1 }' demo.txt root daemon bin sys sync
-
变量
除了$ + 数字表示某个字段,awk还提供其他一些变量。
变量NF表示当前行有多少个字段,因此$NF就代表最后一个字段。$ echo 'this is a test' | awk '{print $NF}' test
$(NF-1)代表倒数第二个字段
$ awk -F ':' '{print $1, $(NF-1)}' demo.txt root /root daemon /usr/sbin bin /bin sys /dev sync /bin
变量NR表示当前处理的是第几行,如果原样输出字符,要放在双引号里面
$ awk -F ':' '{print NR ") " $1}' demo.txt 1) root 2) daemon 3) bin 4) sys 5) sync
awk的其他内置变量如下
变量 含义 FILENAME 当前文件名 FS 字段分隔符,默认是空格和制表符 RS 行分隔符,用于分割每一行,默认是换行符 OFS 输出字段的分隔符,用于打印时分隔字段,默认为空格 ORS 输出字段的分隔符,用于打印时分隔字段,默认为空格 OFMT 数字输出的格式,默认为%.6g -
函数
函数toupper()用于将字符转为大写
$ awk -F ':' '{ print toupper($1) }' demo.txt ROOT DAEMON BIN SYS SYNC
常用的函数
函数名 含义 tolower() 字符转为小写 length() 返回字符串长度 substr() 返回子字符串 -
条件
awk允许指定输出条件,只输出符合条件的行。
格式:$ awk '条件 动作' 文件名
只输出包含usr的行
$ awk -F ':' '/usr/ {print $1}' demo.txt root daemon bin sys
# 输出奇数行 $ awk -F ':' 'NR % 2 == 1 {print $1}' demo.txt root bin sync # 输出第三行以后的行 $ awk -F ':' 'NR >3 {print $1}' demo.txt sys sync
$ awk -F ':' '$1 == "root" {print $1}' demo.txt root $ awk -F ':' '$1 == "root" || $1 == "bin" {print $1}' demo.txt root bin
-
if语句
awk提供了if结构,用于编写复杂的条件
$ awk -F ':' '{if ($1 > "m") print $1}' demo.txt root sys sync
if结构还可以指定else部分。
$ awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt root --- --- sys sync
awk教程
于 2022-03-13 12:21:30 首次发布