Java充电社
专辑
博文
联系我
本人继续续收门徒,亲手指导
Shell专题第13篇:awk命令:文本处理
相关专辑:
Shell专题
<div style="display:none"></div> ## 13.1、awk是什么 一个强大的文本分析工具,吧文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。 ## 13.2、基本用法 ```shell awk [选项] '[/pattern1/]{action1} [/pattern2/]{action2}...' filename ``` - []包含的表示可选的 - pattern:表示awk在数据中查找的内容,正则匹配模式 - action:在找到匹配的内容时执行的一系列命令 ## 13.3、选项说明 | 选项 | 功能 | | ---- | ---------------------- | | -F | 指定分隔符 | | -v | 赋值一个用户定义的变量 | ## 13.4、案例 (1)准备数据,创建awk.txt,内容如下 ```shell java;100;90 linux;120;110 php;90;80 c;150;140 c++;200;190 java;100;200 ``` (2)下面匹配awk.txt中以java开头的行,按照;分割为3列,将每行第3列输出 ```shell [root@test001 shells]# awk -F ';' '/^java/{print $3}' awk.txt 90 200 ``` (3)下面匹配awk.txt中以java开头的行,按照;分割为3列,并输出第1列和第3列,之间以-》隔开 ```shell [root@test001 shells]# awk -F ';' '/^java/{print $1"-》"$2}' awk.txt java-》100 java-》100 ``` (4)下面匹配awk.txt中以java开头的行,按照;分割为3列,并输出第1列和第3列,之间以-》隔开,并在所有结果输出之前添加一行“start”,结束后添加一行“end” > 注意: BEGIN 在所有数据读取行之前执行; END 在所有数据执行之后执行。 ```shell [root@test001 shells]# awk -F ';' 'BEGIN{print "start"} /^java/{print $1"-》"$2} END{print "end"}' awk.txt start java-》100 java-》100 end ``` (4)对awk.txt按照;分割,输出第1列和第2列,中间用->隔开,将第2列添加1 > 下面用-v来定义一个变量i=1,在{action}中可以直接使用这个变量 ```shell [root@test001 shells]# awk -v i=1 -F ';' '{print $1"->"$2+i}' awk.txt java->101 linux->121 php->91 c->151 c++->201 java->101 ``` ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/301/11350611-39ff-4c4b-940c-0b4f990d6fe1.png) ## 13.5、awk内置变量 | 变量 | 说明 | | -------- | --------------------------------------- | | FILENAME | 文件名 | | NR | 已读的记录数(行号) | | NF | 浏览记录的域的个数(切割后, 列的个数) | ## 13.4、案例:内置变量用法 (1)统计passwd文件名,每行的行号,每行的列数 ```shell [root@test001 shells]# awk -F ":" '{print "filename:"FILENAME",linenum:"NR",col:"NF}' /etc/passwd filename:/etc/passwd,linenum:1,col:7 filename:/etc/passwd,linenum:2,col:7 filename:/etc/passwd,linenum:3,col:7 filename:/etc/passwd,linenum:4,col:7 ``` (2)查询ifconfig命令输出结果中的空行所在的行号 ```shell [root@test001 shells]# ifconfig | awk '/^$/{print NR}' 9 18 26 ``` ## 13.5、案例:找出指定的进程,并kill 找出bash相关的所有进程,并kill,下面一步步演示过程。 ```shell [root@test001 shells]# ps -ef | grep " bash$" root 32198 29899 0 5月22 pts/2 00:00:01 bash root 127354 127346 0 5月22 pts/1 00:00:00 bash root 127491 127354 0 5月22 pts/1 00:00:00 bash [root@test001 shells]# ps -ef | grep " bash$" | awk '{print $2}' 32198 127354 127491 [root@test001 shells]# ps -ef | grep " bash$" | awk '{print $2}' | xargs 32198 127354 127491 [root@test001 shells]# ps -ef | grep " bash$" | awk '{print $2}' | xargs kill -9 [root@test001 shells]# ps -ef | grep " bash$" | awk '{print $2}' | xargs ``` 上面整个过程,用一行命令即可操作,如下,大家可以将这条命令改写一下,用来结束一些匹配的进程 ```shell [root@test001 shells]# ps -ef | grep " bash$" | awk '{print $2}' | xargs kill -9 ``` **这里用到了一个xargs命令,这个命令是干嘛的呢?** 管道实现的是将前面的stdout作为后面的stdin,但是有些命令不接受管道的传递方式,最常见的就是ls命令。有些时候命令希望管道传递的是参数,但是直接用管道有时无法传递到命令的参数位,这时候需要xargs,xargs实现的是将管道传输过来的stdin进行处理然后传递到命令的参数位上。**也就是说xargs完成了两个行为:处理管道传输过来的stdin;将处理后的传递到正确的位置上。** 可以试试运行下面的几条命令,应该能很好理解xargs的作用了: ```shell [root@test001 shells]# echo "/etc/inittab" | cat /etc/inittab [root@test001 shells]# echo "/etc/inittab" | xargs cat # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target # # systemd uses 'targets' instead of runlevels. By default, there are two main targets: # # multi-user.target: analogous to runlevel 3 # graphical.target: analogous to runlevel 5 # # To view current default target, run: # systemctl get-default # # To set a default target, run: # systemctl set-default TARGET.target # ``` <a style="display:none" target="_blank" href="https://mp.weixin.qq.com/s/_S1DD2JADnXvpexxaBwLLg" style="color:red; font-size:20px; font-weight:bold">继续收门徒,亲手带,月薪 4W 以下的可以来找我</a> ## 最新资料 1. <a href="https://mp.weixin.qq.com/s?__biz=MzkzOTI3Nzc0Mg==&mid=2247484964&idx=2&sn=c81bce2f26015ee0f9632ddc6c67df03&scene=21#wechat_redirect" target="_blank">尚硅谷 Java 学科全套教程(总 207.77GB)</a> 2. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484192&idx=1&sn=505f2faaa4cc911f553850667749bcbb&scene=21#wechat_redirect" target="_blank">2021 最新版 Java 微服务学习线路图 + 视频</a> 3. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484573&idx=1&sn=7f3d83892186c16c57bc0b99f03f1ffd&scene=21#wechat_redirect" target="_blank">阿里技术大佬整理的《Spring 学习笔记.pdf》</a> 4. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484544&idx=2&sn=c1dfe907cfaa5b9ae8e66fc247ccbe84&scene=21#wechat_redirect" target="_blank">阿里大佬的《MySQL 学习笔记高清.pdf》</a> 5. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485167&idx=1&sn=48d75c8e93e748235a3547f34921dfb7&scene=21#wechat_redirect" target="_blank">2021 版 java 高并发常见面试题汇总.pdf</a> 6. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485664&idx=1&sn=435f9f515a8f881642820d7790ad20ce&scene=21#wechat_redirect" target="_blank">Idea 快捷键大全.pdf</a> ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/1/2883e86e-3eff-404a-8943-0066e5e2b454.png)
相关专辑:
Shell专题