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 是一种编程语言,通用的变量定义,条件语句,循环语句,各种数据结构各种内置函数都有。

用到再慢慢积累

posted @ 2023-06-07 16:42  菜乌  阅读(85)  评论(0编辑  收藏  举报