awk
在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
语法格式:
语法格式解释:
语法格式 | 含义 |
---|---|
BEGIN{} | 正式处理数据之前执行 |
pattern | 匹配模式 |
{commands} | 处理命令,可能多行 |
END{} | 处理完所有匹配数据后执行 |
awk内置变量
内置变量 | 含义 |
---|---|
$0 | 整行内容 |
$1~$n | 当前行的第1-n个字段 |
NF | 当前行的字段个数,也就是有多少列 |
NR | 当前行的行号,从1开始计数 |
FNR | 多文件处理时,每个文件行号单独计数都是从0开始 |
FS | 输入字段分隔符,不指定则默认以空格或tab键分隔 |
RS | 输入行分隔符,默认回车换行 |
OFS | 输出字段分隔符,默认为空格 |
ORS | 输出行分隔符,默认回车换行 |
FILENAME | 当前输入的文件名字 |
ARGC | 命令行参数个数 |
ARGV | 命令行参数数组 |
示例
以下所有示例文件为/etc/passwd,请将其拷贝一份使用
# 打印整行内容
awk '{print $0}' passwd
# 使用":"号作为分隔符,输出第一个字段
awk 'BEGIN{FS=":"}{print $1}' passwd
->root
->bin
->daemon
->adm
->lp
->sync
->shutdown
->...
# 输出行号
awk '{print NR}' passwd
# 多个文件行号单独计数
awk '{print FNR}' passwd file2
# 指定行分隔符
echo "hello-world-hello-linux-hello-java" | awk 'BEGIN{RS="-"}{print $0}'
->hello
->world
->hello
->linux
->hello
->java
->
# 指定输出字段分隔符
awk 'BEGIN{FS=":";OFS=":"}{print NR,$1}' passwd
->1:root
->2:bin
->3:daemon
->4:adm
->5:lp
->...
printf格式化输出
格式符 | 含义 |
---|---|
%s | 打印字符串 |
%d | 打印十进制数 |
%f | 打印一个浮点数 |
%x | 打印十六进制数 |
%o | 打印八进制数 |
%e | 打印数字的科学计数法形式 |
%c | 打印单个字符的ASCII码 |
- | 左对齐 |
+ | 右对齐 |
# | 显示8进制在前面加0,显示16进制在前面加0x |
示例
# 以字符串格式打印第1个字段,以":"作为分隔符
awk 'BEGIN{FS=":"}{printf "%st",$1}' passwd
->root bin daemon adm lp ...
# 以字符串格式打印第1个字段和对应行号,输出格式为"行号:字段内容"
awk 'BEGIN{FS=":"}{printf "%d:%sn",NR,$1}' passwd
->1:root
->2:bin
->3:daemon
->4:adm
->5:lp
->...
# 左对齐
# 在不指定位数的情况下默认左对齐,指定位数后为右对齐(必须指定位数)
awk 'BEGIN{FS=":"}{printf "%10d:%sn",NR,$1}' passwd
-> 1:root
-> 2:bin
-> 3:daemon
-> 4:adm
-> 5:lp
->...
awk 'BEGIN{FS=":"}{printf "%-10d:%sn",NR,$1}' passwd
->1 :root
->2 :bin
->3 :daemon
->4 :adm
->5 :lp
->...