AWK常用(半草稿)
目录
警告
本文最后更新于 2022-06-23,文中内容可能已过时。
1. 摘要
awk ' BEGIN{ 语句 } statements2 {语句} END{ 语句 } '
BEGIN { 语句 }
:在读取任何输入前执行一次 语句END { 语句 }
:读取所有输入之后执行一次 语句表达式 { 语句 }
: 对于 表达式 为真(即,非零或非空)的行,执行 语句/正则表达式/ { 语句 }
: 如果输入行包含字符串与 正则表达式 相匹配,则执行 语句组合模式 { 语句 }
: 一个 组合模式 通过与(&&
),或(||
),非(|
),以及括弧来组合多个表达式;对于组合模式为真的每个输入行,执行 语句模式1,模式2 { 语句 }
: 范围模式(range pattern
)匹配从与 模式1 相匹配的行到与 模式2 相匹配的行(包含该行)之间的所有行,对于这些输入行,执行 语句 。BEGIN
和END
不与其他模式组合。范围模式不可以是任何其他模式的一部分。BEGIN
和END
是仅有的必须搭配动作的模式。
2. awk 变量
$n
: 分割后,第n
列的字段${1..n}
代表当前行的1-n
的列值$0
: 代表整行的数据FS
: 表示使用的列的分割符(默认空格,位于BEGIN
模块,命令行中-F
指定)OFS
: 输出列的分割符,默认print $1,$2
的时候中间的,
代表空格(默认),可使用OFS
进行更改,位于BEGIN
模块当中NF
: 分割后,当前行一共多少个字段($NF
最后一列,$(NF-1)
倒数第2列)NR
: 记录行号,表示当前正在处理的记录的行的号码FNR
: 各文件分别计数的行号RS
: 表示行分隔符,表示每个记录输入的时候的分割符,即行与行是如何分割的(内置变量RS用来存放输入的记录分割符,可通过BEGIN
模块来进行修改,支持正则表达式ORS
: 输出记录分隔符(输出换行符),输出时用指定符号代替换行符,默认行的分割符为\n
FILENAME
: 当前文件名ARGC
:命令行参数的个数ARGV
: 数组,命令行参数的值
示例
-
RS
: 表示行分隔符,表示每个记录输入的时候的分割符,即行与行是如何分割的(内置变量RS用来存放输入的记录分割符,可通过BEGIN
模块来进行修改,支持正则表达式- 示例
1
:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
[root@00 ~]# head -2 /etc/passwd|awk 'BEGIN{RS=":"}{print NR,$0}' ### root:x:0:0:root:/root:/bin/bash ### ### bin:x:1:1:bin:/bin:/sbin/nologin ### 1 root 2 x 3 0 4 0 5 root 6 /root 7 /bin/bash # <<=== 此处本身包含一个换行符 bin 8 x 9 1 10 1 11 bin 12 /bin 13 /sbin/nologin
- 示例
2
:1 2 3 4 5 6 7 8 9 10 11
[root@00 ~]# head -n 3 /etc/passwd|awk 'BEGIN{RS="[:/0-9]+|\n"}{print $0}' |sort|uniq -c ### root:x:0:0:root:/root:/bin/bash ### ### bin:x:1:1:bin:/bin:/sbin/nologin ### ### daemon:x:2:2:daemon:/sbin:/sbin/nologin ### 1 bash 4 bin 2 daemon 2 nologin 3 root 3 sbin 3 x
- 示例
-
FS
: 输入分割符,命令处理参数使用-F
指定分割符,或者使用变量形式修改- 示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
$> awk -F ":" 'NR==12,NR==15{print NR,$1,$3}' pwd.txt 12 ftp 14 13 nobody 65534 14 systemd-coredump 999 15 systemd-network 192 $> awk -v FS=":" 'NR==12,NR==15{print NR,$1,$3}' pwd.txt 12 ftp 14 13 nobody 65534 14 systemd-coredump 999 15 systemd-network 192 $> head -1 passwd |awk 'BEGIN{FS=":"}{print $1,$2}' ### root:x:0:0:root:/root:/bin/bash ### root x
- 示例:
-
OFS
: 输出分割符,使用OFS
变量进行修改- 示例:
1 2 3 4 5
$> awk -F ":" -v OFS="--" 'NR==12,NR==15{print NR,$1,$3}' pwd.txt 12--ftp--14 13--nobody--65534 14--systemd-coredump--999 15--systemd-network--192
- 示例:
-
其他示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# 打印范围 $> awk -F: 'NR==12,NR==15{print NR,$1,$3}' pwd.txt 12 ftp 14 13 nobody 65534 14 systemd-coredump 999 15 systemd-network 192 # 自定义变量 awk -v param=n_user 'BEGIN{print "当前用户: " param}' 当前用户: n_user $> param=$(whoami) $> echo $param cxd $> awk -v param=$param 'BEGIN{print "当前用户: " param}' 当前用户: cxd
3. 域
awk
默认分割符为空格,或者连续的空格,tab默认也为(连续)空格- 当
awk
中只存在条件时,默认输出整行
4. 正则匹配
- 搜索
/etc/passwd
中用户主目录在root
下的用户名和bash
变量~正则
表示变量值匹配正则表达式变量!~正则
表示变量值不匹配正则表达式
|
|
5. BEGIN and END
BEGIN{变量定义}
{判断和计算}
END{判读和计算完结执行操作}
|
|
awk 格式化输出
- 示例:
|
|
awk 模式
|
|
6. awk 数组
类似key=value
7. awk 循环
foreach
循环