常用 awk 操作

NAME

awk: 文本和数据进行处理的编程语言

SYNOPSIS

awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

OPTION && FORMAT

awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)

OPTIONS

  • -F fs 指定输入分隔符, fs可以是字符串或正则表达式 默认的分隔符是连续的空格或制表符
  • -v var=value 赋值一个用户定义变量, 将外部变量传递给 awk
  • -f scriptfile 从脚本文件中读取 awk 命令

EXAMPLE

docker ps -a的输出为例, 对输出结果清洗

  • 1.获取第二行之后数据
    docker ps -a | awk 'NR>1 {print}'
    图片

  • 2.只获取第一列的数据和第五列的数据
    docker ps -a | awk 'NR>1 {print $1, $5}'
    图片

  • 3.可以看到 $5 取得的第五列并不一样, 因为默认情况下, awk 以空格分隔符, 但是空格的数量不确定.
    因此, 我们自定义一下分割符号

    ## 以三个空格为分割符
    docker ps -a | awk -F " " 'NR>1 {print $1, $5}'

    图片

    ## 至少三个连续空格为分割符
    docker ps -a | awk -F "[[:space:]]{3,}" 'NR>1 {print $1, $5}'

    图片

ADVANCED

docker ps的输出为例, 对输出结果清洗

  • 输入分割符: -v FS

  • 输出分隔符: -v OFS

  • 指定输入分隔符为两个连续空格

    ## 以下两种写法一样
    docker ps | awk -v FS=" " 'NR>1 {print $1, $2}'
    docker ps | awk -F " " 'NR>1 {print $1, $2}'

    图片

  • 指定输出分隔符为连个连续*

    docker ps | awk -v FS="  " -v OFS="**" 'NR>1 {print $1, $2}' 

    图片