跳到主要内容

1、awk

awk命令

目录

[toc]

简介

awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序。

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能

它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV 那样的每行格式相同的文本文件,awk可能是最方便的工具。

awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上。 awk 是三剑客的老大,利剑出鞘,必会不同凡响。

基本用法

awk '{pattern + action}' {filenames}

尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号{}不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

选项

命令案例

案例:基础命令

awk '{print $0}'

下面,我们先用标准输入(stdin)演示上面这个例子。

[root@hexo-blog linux-test]# echo 'this is a test' | awk '{print $0}'
this is a test

上面代码中,print $0就是把标准输入this is a test,重新打印了一遍

awk会根据空格和制表符,将每一行分成若干字段,依次用$1$2$3代表第一个字段、第二个字段、第三个字段等等。

[root@hexo-blog linux-test]# echo 'this is a test' | awk '{print $0}'
this is a test
[root@hexo-blog linux-test]# echo 'this is a test' | awk '{print $1}'
this
[root@hexo-blog linux-test]# echo 'this is a test' | awk '{print $2}'
is
[root@hexo-blog linux-test]# echo 'this is a test' | awk '{print $3}'
a

上面代码中,$3代表this is a test的第三个字段a。

案例:指定分隔符 -F

awk -F ':' '{print $1}' demo.txt
或者
awk -F: '{print $1}' demo.txt

下面,为了便于举例,我们把/etc/passwd文件保存成demo.txt。

[root@hexo-blog linux-test]# cat /etc/passwd > demo.txt
[root@hexo-blog linux-test]# cat demo.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

这个文件的字段分隔符是冒号(:),所以要用**-F参数指定分隔符为冒号**。然后,才能提取到它的第一个字段。

[root@hexo-blog linux-test]# awk -F ':' '{print $1}' demo.txt
root
bin
daemon
adm
lp
sync
shutdown
halt
mail

或者:直接这种格式也是可以的

[root@hexo-blog linux-test]# awk -F: '{print $1}' demo.txt
root
bin
daemon
adm
lp
sync
shutdown
halt
mail

案例:正则

##打印以xx开头的
[root@hexo-blog linux-test]# netstat -n |awk '/^tcp/ {print $5}' | awk -F: '{print $1}'
100.100.167.125
100.100.30.26
100.100.167.125
101.229.206.141

案例:awk命令给文本文件指定行前插入内容

awk -v text="Your Text to Insert" 'NR==1 {print text} {print}' filename > newfile

这会在 filename 文件的首行之前插入指定的文本,并将结果写入 newfile 文件。

选项含义:

        -v var=val              --assign=var=val
  • 自己测试(测试成功)
##1、查看测试文本内容
[root@hg-linux-test ~]# cat test.txt
1
2
3

##2、awk命令替换
awk -v text="Your Text to Insert" 'NR==1 {print text} {print}' test.txt > newfile #NR==1,代表第一行

##3、验证
[root@hg-linux-test ~]# cat newfile
Your Text to Insert
1
2
3

范例:选项NF使用 打印当前行的最后一个字段

grep image: install.yaml | awk -F 'image: ' '{print $NF}' 帮我解释下这条命令的含义,其中{print $NF}是啥意思?

这条命令:

grep image: install.yaml | awk -F 'image: ' '{print $NF}'

是一个常见的 Unix/Linux 命令行组合,用于从文件 install.yaml 中提取包含 image: 关键字的行,并进一步提取出关键字后面的值。我们可以将它分解成两个部分来理解:

  1. grep image: install.yaml:

    • grep 是一个命令行工具,用于搜索文本中的特定模式。
    • image: 是搜索模式,它将匹配所有包含 image: 的行。
    • install.yaml 是目标文件,grep 将在这个文件中搜索匹配 image: 的行。

    这一部分的作用是从 install.yaml 文件中找出所有包含 image: 的行。

  2. awk -F 'image: ' '{print $NF}':

    • awk 是一个强大的文本处理工具,用于对文本进行格式化和处理。
    • -F 'image: '-F 选项用于指定字段分隔符,这里指定 image: 作为字段分隔符。这意味着 awk 将每一行按照 image: 进行分割。
    • {print $NF}:这是 awk 的一个动作部分,表示打印当前行的最后一个字段$NFawk 中的一个特殊变量,表示当前行的最后一个字段,其中 NF 表示字段的总数。

    这一部分的作用是处理由 grep 提取出来的每一行,按照 image: 进行分割,并打印分割后的最后一个字段。

示例

假设 install.yaml 文件内容如下:

containers:
- name: app-container
image: nginx:1.19.6
- name: db-container
image: postgres:13.1

使用 grep image: install.yaml 命令,将输出:

    image: nginx:1.19.6
image: postgres:13.1

然后,使用 awk -F 'image: ' '{print $NF}' 对以上输出进行处理:

  • 对于行 image: nginx:1.19.6,按照 image: 分割后得到两个部分:' ''nginx:1.19.6'$NF 表示最后一个字段,即 nginx:1.19.6
  • 对于行 image: postgres:13.1,按照 image: 分割后得到两个部分:' ''postgres:13.1'$NF 表示最后一个字段,即 postgres:13.1'

最终输出将是:

nginx:1.19.6
postgres:13.1

总结

  • grep image: install.yaml:从文件 install.yaml 中提取包含 image: 的行。
  • awk -F 'image: ' '{print $NF}':处理提取出来的行,按 image: 进行分割,并打印最后一个字段。

{print $NF} 中的 $NFawk 中的一个变量,用于表示当前行的最后一个字段。通过这种方式,这条命令能够提取出 install.yaml 文件中所有 image: 关键字后面的图像名称。

案例:过滤以xx开头的行

echo -e "\tMemory       : $(free -h | awk '/^Mem:/ { print $3 "/" $2 }')"
echo -e "\tSWAP : $(free -h | awk '/^Swap:/ { print $3 "/" $2 }')"

image-20240729061243646

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号 《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

http://onedayxyy.cn/

🍀 语雀

https://www.yuque.com/xyy-onlyone

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!