Linux 文本分析 | awk
awk 是 Linux 中非常强大的文本分析编程工具
awk 的输入可以是标准输入,文件或其他命令的输出
awk 将输入逐行读入,以空格为默认分隔符进行切割并处理
基础用法
筛选每一行的指定列
# 筛选第二列内容
# print 表示打印
echo "name1 china 22 address1" | awk '{print $2}'
echo -e "name1 china 22 address1\nname2 china 18" | awk '{print $1}'
# 打印多列,用逗号分隔
echo "name1 china 22 address1" | awk '{print $1,$2}'
-
awk 中默认以空格或 tab 键分割数据
-
$0
表示所有列,$1
表示第一列,$2
表示第二列,以此类推
如果每一行的列不一致,而又想要最后一列数据,
# NF 表示每一行的字段数,$NF 表示最后一列
# 取倒数第二列则用 $(NF-1)
echo "name1 china 22 address1" | awk '{print $NF}'
-
常用的内置变量有:
NF 每一行字段数
FILENAME 当前文件名
FS 字段分隔符,默认是空格和制表符。
RS 行分隔符,用于分割每一行,默认是换行符。
OFS 输出字段的分隔符,用于打印时分隔字段,默认为空格。
ORS 输出记录的分隔符,用于打印时分隔记录,默认为换行符。
OFMT 数字输出的格式,默认为%.6g。
自定义分隔符
# -F 参数,指定分隔符为竖线
echo "name1|china|22|address1" | awk -F '|' '{print $(NF-1)}'
条件
正则匹配
# 正则在两个斜线中间
# 下面将筛选包含 ‘china’ 行的第一列
echo "name1|china|22|address1" | awk -F '|' '/china/ {print $1}'
逻辑判断
# 筛选奇数行的第一列
echo "name1|china|22|address1" | awk -F '|' 'NR % 2 == 1 {print $1}'
# 根据每个字段的内容筛选内容
echo "name1|china|22|address1" | awk -F '|' '$2 == "china" && $3 <= "22" {print $1}'
if else
# if 语句在花括号内部
echo "name1|china|22|address1" | awk -F '|' '{if ($2 == "china" && $3 <= "22") print $1}'
# if else 结构
echo "name1|china|22|address1" | awk -F '|' '{if ($2 == "japan") print $1; else print "--"}'
函数
# 将筛选内容转换为大写
echo "name1|china|22|address1" | awk -F "|" '{print toupper($2)}'
-
常用的内置函数有:
tolower() 字符转为小写
length() 返回字符串长度
substr() 返回子字符串
sin() 正弦
cos() 余弦
sqrt() 平方根
rand() 随机数
-
还有其他函数,如时间函数,字符串函数等
begin...end
前后加固定内容
# BEGIN 和 END 必须是大写
# 在数据第一行显示列名
echo "name1|china|22|address1" | awk -F "|" 'BEGIN {print "name|country"} {print $1"|"toupper($2)}'
# 最后一行输出虚线结尾
echo "name1|china|22|address1" | awk -F "|" 'BEGIN {print "name|country"} {print $1"|"toupper($2)} END {print "-
-----"}'
- aws 先执行 BEGIN,然后读取文件处理数据,最后执行 END
自定义变量
echo "name1 china 22 address1" | awk 'BEGIN {count = 0; count++} {print $1,$2} END {print "count is", count}'
循环语句
cat test.txt | awk 'BEGIN {count = 0} {name[count] = $1 count++} END {for (i = 0; i < NR; i++) print i,name[i]}'
-
awk 中同样支持循环语句:
while
do...while
for
break
continue
awk 调用方式
命令行执行
在命令行中执行 awk 命令
cat test.txt | awk '{print $0}'
shell 脚本方式
类似 shell 文件,将 awk 命令写入 sh 文件
将首行的解释器改为 #!/bin/awk
awk 命令调用方式
将 awk 命令写入 sh 文件,然后用 awk 命令调用
# awk-command.sh 是 awk 命令集文件
# test.txt 是需要处理的数据文件
awk -f awk-command.sh test.txt
awk 是一种编程语言,通用的变量定义,条件语句,循环语句,各种数据结构各种内置函数都有。
用到再慢慢积累