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}'
如果每一行的列不一致,而又想要最后一列数据,
# NF 表示每一行的字段数,$NF 表示最后一列
# 取倒数第二列则用 $(NF-1)
echo "name1 china 22 address1" | awk '{print $NF}'
自定义分隔符
# -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)}'
前后加固定内容
# 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 "-
-----"}'
自定义变量
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 命令
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 是一种编程语言,通用的变量定义,条件语句,循环语句,各种数据结构各种内置函数都有。