awk命令和用法
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
awk脚本 关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。
BEGIN{ 这里面放的是执行前的语句 } END {这里面放的是处理完所有的行后要执行的语句 } {这里面放的是处理每一行时要执行的语句}
模式匹配 当awk读入一行时,它试图匹配脚本中的每个模式匹配规则。只有与一个特定的模式相匹配的输入行才能成为操作对象。如果没有指定操作,与模式相匹配的输入行将被打印出来(执行打印语句是一个默认操作)。
[root@localhost ~]# cat 123
Hello World
[root@localhost ~]# awk '/^$/{print"Hello World"}' 123
Hello World
Hello World
Hello World
记录和字段 awk假设它的输入是有结构的,而不只是一串无规则的字符。在最简单的情况下,它将每个输入行作为一条记录,而将由空格或制表符(tab)分隔的单词作为字段(用来分隔字段的字符被称为分隔符,默认的分隔符就是空格,并且不管有多少个空格,它都会合并成一个)。 字段和引用的分离 awk允许使用字段操作符$来指定字段。在该操作符后面跟着一个数字或变量,用于标识字段的位置。“$1”表示第一个字段,“$2”表示第二个字段等等。“$0”表示整个输入记录。
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 26M 1.8G 2% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/cs-root 46G 8.2G 37G 19% /
/dev/sda1 1014M 243M 772M 24% /boot
tmpfs 371M 1.2M 370M 1% /run/user/42
tmpfs 371M 5.7M 366M 2% /run/user/0
[root@localhost ~]# df -h | awk '{print $1}'
文件系统
devtmpfs
tmpfs
tmpfs
tmpfs
/dev/mapper/cs-root
/dev/sda1
tmpfs
tmpfs
[root@localhost ~]# df -h | awk '{print $1,$2}'
文件系统 容量
devtmpfs 1.8G
tmpfs 1.9G
tmpfs 1.9G
tmpfs 1.9G
/dev/mapper/cs-root 46G
/dev/sda1 1014M
tmpfs 371M
tmpfs 371M
下面这个正则表达式可以分段进行解释。“1?”表示出现零个或一个1;“(-I)?”表示在随后的位置上查找一个连字符或一个空格,或什么也没有;“(?”表示查找零个或一个左括号;反斜杠能够防止将“(”解释为用于分组的元字符;“[O-9]+”表示查找一个或多个数字;注意我们采用了简便的方法,仅指定一到多位数字,而不是精确地指定3位数字。在随后的位置,我们查找一个可选的右括号,接着查找一个空格或一个连字符,或什么也没有。然后用”[O~9]+”查找一到多位数字,随后跟一个连字符,最后跟一到多位数字。
[root@localhost ~]# cat 123
707-724-0000
(707) 724-0000
(707)724-0000
1-707-724-0000
1 707-724-0000
1(707)724-0000
[root@localhost ~]# awk '/1?[- ]?\(?[0-9]+\)?[- ]?[0-9]+-[0-9]+/' 123
707-724-0000
(707) 724-0000
(707)724-0000
1-707-724-0000
1 707-724-0000
1(707)724-0000
[root@localhost ~]# awk '/^\([0-9]+\) ?[0-9]+-[0-9]+/' 123
(707) 724-0000
(707)724-0000
awk常见的内建变量(可直接使用)
运算符 | 描述 |
---|
= += -= *= /= %= ^= **= | 赋值 | ?: C | 条件表达式 | && | 逻辑与 | ~ 和 !~ | 匹配正则表达式和不匹配正则表达式 | < <= > >= != == | 关系运算符 | 空格 | 连接 | + - | 加,减 | * / % | 乘,除与求余 | + - ! | 一元加,减和逻辑非 | ^ *** | 幂 | ++ – | 增加或减少,作为前缀或后缀 | $ | 字段引用 | in | 数组成员 |
可选的参数: -v 定义变量 -f 调用脚本 -F 指定分隔符
? 尽管操作可能会很复杂,但语法总是这样,其中 BEGIN 表示 在开始之前做的事, // 是匹配代码块,可以是字符串或正则表达式,用斜杠包起来。而 action 是在找到匹配内容时所执行的一系列命令,包含一条或多条命令,多条命令用 ; 隔开。END{} 是结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
? awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。 awk中字符的含义
$0 | 表示全部内容 |
---|
$1 | 每行第一个字段 | NF | 字段数量 | NR | 每行的记录号,多文件记录递增 | FNR | 与NR类似,不过多文件记录不递增,每个文件都从1开始 | \t | 制表符,tab键一个位置 | \n | 换行符 | FS | BEGIN时定义分隔符 | RS | 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入) | ~ | 包含 | !~ | 不包含 | == | 等于,必须全部相等,精确比较 | != | 不等于,精确比较 | && | 逻辑与 | | | -F [:#/] | 定义了三个分隔符 | + | 匹配时表示1个或1个以上 | OFS | 输出字段分隔符, 默认也是空格,可以改为其他的 | ORS | 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕 | /[0-9][0-9]+/ | 两个或两个以上数字 | /[0-9][0-9]*/ | 一个或一个以上数字 |
调用awk 1.将所有的awk命令插入一个单独文件,然后调用: awk -f awk-script-file input-file(s) 其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
2.命令行方式 awk [-F field-separator] ‘commands’ input-file(s) 其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
3.shell脚本方式 将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。 相当于shell脚本首行的:#!/bin/sh 可以换成:#!/bin/awk
|