快捷菜单
常用功能一站直达
更多功能请点顶栏「快捷菜单」

[toc]
awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序。
awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV 那样的每行格式相同的文本文件,awk可能是最方便的工具。
awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上。 awk 是三剑客的老大,利剑出鞘,必会不同凡响。
1awk '{pattern + action}' {filenames}尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号{}不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。
awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
1awk '{print $0}'下面,我们先用标准输入(stdin)演示上面这个例子。
1[root@hexo-blog linux-test]# echo 'this is a test' | awk '{print $0}'
2this is a test上面代码中,print $0就是把标准输入this is a test,重新打印了一遍。
awk会根据空格和制表符,将每一行分成若干字段,依次用$1、$2、$3代表第一个字段、第二个字段、第三个字段等等。
1[root@hexo-blog linux-test]# echo 'this is a test' | awk '{print $0}'
2this is a test
3[root@hexo-blog linux-test]# echo 'this is a test' | awk '{print $1}'
4this
5[root@hexo-blog linux-test]# echo 'this is a test' | awk '{print $2}'
6is
7[root@hexo-blog linux-test]# echo 'this is a test' | awk '{print $3}'
8a上面代码中,$3代表this is a test的第三个字段a。
-F1awk -F ':' '{print $1}' demo.txt
2或者
3awk -F: '{print $1}' demo.txt下面,为了便于举例,我们把/etc/passwd文件保存成demo.txt。
1[root@hexo-blog linux-test]# cat /etc/passwd > demo.txt
2[root@hexo-blog linux-test]# cat demo.txt
3root:x:0:0:root:/root:/bin/bash
4bin:x:1:1:bin:/bin:/sbin/nologin
5daemon:x:2:2:daemon:/sbin:/sbin/nologin
6adm:x:3:4:adm:/var/adm:/sbin/nologin
7lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8sync:x:5:0:sync:/sbin:/bin/sync
9shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
10halt:x:7:0:halt:/sbin:/sbin/halt
11mail:x:8:12:mail:/var/spool/mail:/sbin/nologin这个文件的字段分隔符是冒号(:),所以要用**-F参数指定分隔符为冒号**。然后,才能提取到它的第一个字段。
1[root@hexo-blog linux-test]# awk -F ':' '{print $1}' demo.txt
2root
3bin
4daemon
5adm
6lp
7sync
8shutdown
9halt
10mail或者:直接这种格式也是可以的
1[root@hexo-blog linux-test]# awk -F: '{print $1}' demo.txt
2root
3bin
4daemon
5adm
6lp
7sync
8shutdown
9halt
10mail1##打印以xx开头的
2[root@hexo-blog linux-test]# netstat -n |awk '/^tcp/ {print $5}' | awk -F: '{print $1}'
3100.100.167.125
4100.100.30.26
5100.100.167.125
6101.229.206.1411awk -v text="Your Text to Insert" 'NR==1 {print text} {print}' filename > newfile这会在 filename 文件的首行之前插入指定的文本,并将结果写入 newfile 文件。
选项含义:
1 -v var=val --assign=var=val 1##1、查看测试文本内容
2[root@hg-linux-test ~]# cat test.txt
31
42
53
6
7##2、awk命令替换
8awk -v text="Your Text to Insert" 'NR==1 {print text} {print}' test.txt > newfile #NR==1,代表第一行
9
10##3、验证
11[root@hg-linux-test ~]# cat newfile
12Your Text to Insert
131
142
153NF使用 打印当前行的最后一个字段grep image: install.yaml | awk -F 'image: ' '{print $NF}' 帮我解释下这条命令的含义,其中{print $NF}是啥意思?
这条命令:
1grep image: install.yaml | awk -F 'image: ' '{print $NF}'是一个常见的 Unix/Linux 命令行组合,用于从文件 install.yaml 中提取包含 image: 关键字的行,并进一步提取出关键字后面的值。我们可以将它分解成两个部分来理解:
grep image: install.yaml:
grep 是一个命令行工具,用于搜索文本中的特定模式。image: 是搜索模式,它将匹配所有包含 image: 的行。install.yaml 是目标文件,grep 将在这个文件中搜索匹配 image: 的行。这一部分的作用是从 install.yaml 文件中找出所有包含 image: 的行。
awk -F 'image: ' '{print $NF}':
awk 是一个强大的文本处理工具,用于对文本进行格式化和处理。-F 'image: ':-F 选项用于指定字段分隔符,这里指定 image: 作为字段分隔符。这意味着 awk 将每一行按照 image: 进行分割。{print $NF}:这是 awk 的一个动作部分,表示打印当前行的最后一个字段。$NF 是 awk 中的一个特殊变量,表示当前行的最后一个字段,其中 NF 表示字段的总数。这一部分的作用是处理由 grep 提取出来的每一行,按照 image: 进行分割,并打印分割后的最后一个字段。
示例
假设 install.yaml 文件内容如下:
1containers:
2 - name: app-container
3 image: nginx:1.19.6
4 - name: db-container
5 image: postgres:13.1使用 grep image: install.yaml 命令,将输出:
1 image: nginx:1.19.6
2 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'。最终输出将是:
1nginx:1.19.6
2postgres:13.1总结
grep image: install.yaml:从文件 install.yaml 中提取包含 image: 的行。awk -F 'image: ' '{print $NF}':处理提取出来的行,按 image: 进行分割,并打印最后一个字段。{print $NF} 中的 $NF 是 awk 中的一个变量,用于表示当前行的最后一个字段。通过这种方式,这条命令能够提取出 install.yaml 文件中所有 image: 关键字后面的图像名称。
1echo -e "\tMemory : $(free -h | awk '/^Mem:/ { print $3 "/" $2 }')"
2echo -e "\tSWAP : $(free -h | awk '/^Swap:/ { print $3 "/" $2 }')"
我的博客主旨:
🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

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

🍀 个人博客站点


🍀 语雀
https://www.yuque.com/xyy-onlyone

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

🍀 知乎
https://www.zhihu.com/people/foryouone

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!
日历 · 精选 · 友链 · 更多
如果内容对你有帮助,欢迎请我喝杯咖啡 ☕



One的公众号
爱折腾博客的小白