• Linux命令-awk


    awk 是一个强大的文本分析工具,主要用于数据扫描、过滤、统计汇总工作,数据可以来自标准输入、管道或者文件。

    首先理解一下两个概念:

    • 记录:文件的每行数据都被称为记录,awk 每次从文件中读取一条记录(行)。
    • 字段:每条记录(行)被分成若干字段(列),默认以空格或制表符为分隔符(也可以通过 -F 选项指定分隔符)

    语法awk [选项] '/pattern1/{action1} /pattern2/{action2} ...' filename

    选项

    • -F: 指定输入文件中每条记录的字段之间的分割符
    • -v: 定义一个用户变量

    awk 的内置变量

    • FILENAME 当前输入文档的文件名
    • NR 读取到的行记录数,也就是行数
    • NF 读取到的以分隔符切割出来的列的记录数,也就是列数
    • $0 当前行的全部数据
    • $n 当前行的第n个字段的内容
    • RS 输出字段

    /etc/passwd 文件中,所有行中,以冒号(:)为分隔符,的第 1 列和第 7 列,进行打印操作,注意 -F 与分隔符冒号(:)之间的空格可用可不用。

    $ cat /etc/passwd | awk -F : '{print $1,$7}'
    root /bin/bash
    daemon /usr/sbin/nologin
    bin /usr/sbin/nologin
    sys /usr/sbin/nologin
    ...省略输出...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 因为没有指定/pattern/,也就是匹配每条记录的意思。
    • print 操作符可以打印变量,如果变量之间用逗号(,)隔开,则打印出来的变量会自动以空格隔开两个变量。

    /etc/passwd 文件中,以 bin 开头的行中,以冒号(:)为分隔符,的第 1 列和第 7 列,进行打印操作

    $ cat /etc/passwd | awk -F : '/^bin/{print $1 "," $7}'
    bin,/usr/sbin/nologin
    
    • 1
    • 2

    /etc/passwd 文件中,以 bin 开头的行中,以冒号(:)为分隔符,的行号(用到内置变量 NR )以及第 1 列和第 7 列,进行打印操作

    $ cat /etc/passwd | awk -F : '/^bin/{print NR "," $1 "," $7}'
    3,bin,/usr/sbin/nologin
    
    • 1
    • 2

    BEING 和 END

    awk 可以通过 BEINGEND 在分析读取文本之前以及之后执行一次 {action} 操作,一般用 BEGIN 来进行初始化,用 END 来进行汇总。

    $ cat /etc/passwd | awk -F: 'BEGIN{print "打印 bin 用户登录权限"} /^bin/{print NR "," $1 "," $7} END{print "共有 "NR" 行"}'
    打印 bin 用户登录权限
    3,bin,/usr/sbin/nologin
    共有 48 行
    
    • 1
    • 2
    • 3
    • 4

    自定义用户变量

    $ cat /etc/passwd | awk -v a="自定义变量" '{print a}'
    自定义变量
    自定义变量
    自定义变量
    ...省略输出...
    
    • 1
    • 2
    • 3
    • 4
    • 5

    你会发现这条语句会打印48行的"自定义变量",因为它读取了48次(也就是每行都读取并打印一次)

    分割符变量

    awk 为输入、输出分隔符指定了变量名,并赋予了默认值,其中:

    • RS :输入记录的分隔符,默认为行(\n);
    • ORS :输出记录的分隔符,,默认也为行(\n);
    • OFS :输出字段的分隔符,默认为空格。

    为什么没有输入字段分割符的变量?因为这个分隔符是直接通过 -F 选项来指定的。

    我们对上一条命令的输出记录分隔符指定为空格

    $ cat /etc/passwd | awk -v a="自定义变量" -v ORS=" " '{print a}'
    自定义变量 自定义变量 自定义变量 自定义变量 ...省略输出...
    
    • 1
    • 2

    指定多个分隔符

    awk 可以通过 [] 来指定多个分割符,下面的命令指定了左中括号 ([) 和右中括号 (]) 作为分隔符。

    $ echo [abc][def][ghi] | awk -F [][] '{print $2}'
    abc
    
    • 1
    • 2
  • 相关阅读:
    阿里云99元的主机到底怎么样?
    保研计网复习笔记:数据链路层
    Go语言读取文件内容
    Vue3学习系列之《列表渲染》
    基于SpringBoot的漫画动漫网站
    关于我们编写好的java程序是如何运行部署的
    MAC 通过IDEA启动tomcat,显示80端口被占用解决办法
    ffmpeg录屏命令
    建模助手:Revit中梁注释设置表达相对净高
    matlab中的iddata函数的初步理解和使用程序举例
  • 原文地址:https://blog.csdn.net/ymz641/article/details/126526445