前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >正则复习2

正则复习2

作者头像
端碗吹水
发布2020-09-23 10:10:31
1.6K0
发布2020-09-23 10:10:31
举报
文章被收录于专栏:程序猿的大杂烩

笔记内容:

l awk 中使用外部shell变量

l awk 合并一个文件

l 把一个文件多行连接成一行

l awk中gsub函数的使用

l awk 截取指定多个域为一行

l 过滤两个或多个关键词

l 用awk生成以下结构文件

l awk用print打印单引号

l 合并两个文件

笔记日期:

扩展 awk 中使用外部shell变量http://ask.apelearn.com/question/199 命令示例:A=44echo "ABCD" | awk -v GET_A=$A '{print GET_A}'

说明:-v选项用于定义参数,这里表示将变量A的值赋予GET_A。有多少个变量需要赋值,就需要多少个-v选项。与之等价的:应用于脚本中:

wKioL1nkJ8_hyJ9_AAIri81crtc365.png
wKioL1nkJ8_hyJ9_AAIri81crtc365.png

文件内容: cat filename 1111111:13443253456 2222222:13211222122 1111111:13643543544 3333333:12341243123 2222222:12123123123

运行脚本后结果为: [1111111] 13443253456 13643543544 [2222222] 13211222122 12123123123 [3333333] 12341243123

实际操作实例:

脚本代码:

wKioL1nkJ9HyX428AAQW2j83Oyg956.png
wKioL1nkJ9HyX428AAQW2j83Oyg956.png

文件内容:

wKiom1nkKoiCE0XhAALxP2oj-s4251.png
wKiom1nkKoiCE0XhAALxP2oj-s4251.png

运行结果:

wKiom1nkKoqC1NmEAAQasWHSJZ4114.png
wKiom1nkKoqC1NmEAAQasWHSJZ4114.png

awk 合并一个文件

http://ask.apelearn.com/question/493 

  我有这样的一个需求,我需要把两个文件中,第一列相同的行合并到同一行中。举个例子,有两个文件,内容如下

wKioL1nkJ9WSskWFAAUc1ihWKnc377.png
wKioL1nkJ9WSskWFAAUc1ihWKnc377.png

现在我想要这个两个文件合并后的结果为:

1 ab aa   2 cd bb   3 ad ee   4 bd ss   5 de

实现这个需求的命令示例:

awk ‘NR==FNR{a[1]=2}NR>FNR{print 0,a[1]}’ 1.txt 2.txt

wKioL1nkJ9firmObAAOX2F_5fdY715.png
wKioL1nkJ9firmObAAOX2F_5fdY715.png

命令解释:NR表示的是读取的行数(NR会一直累加),FNR则表示读取的当前行数,先读完1.txt的行数再读2.txt的行数,所以其实NR==FNR 就表示读取1.txt的时候。 同理NR>FNR则表示读取2.txt的时候,数组a其实就相当于一个map。

  下面这种写法可能比较好读懂些:

wKiom1nkKo7zTMX-AANJyjq4Si8045.png
wKiom1nkKo7zTMX-AANJyjq4Si8045.png

流程:

当读取1.txt时

第一行时:NR=0,FNR=0,

第二行时:NR=1,FNR=1,

……

最后一行时,NR=3,FNR=3,

然后开始读2.txt

读2.txt第一行时,NR=4,FNR=0,此时NR>FNR,所以开始打印第一行1 ab aa

第二行时,NR=5,FNR=2,同样满足NR>FNR,所以开始打印第二行2 cd bb

……

2.txt最后一行时,NR=7,FNR=4,打印最后一行5 de

从上面我们发现几个特点:

1、第二个文件有几行,就打印几行,因为只有读到第二个文件时,才满足NR>FNR,才能打印

2、NR、FNR都是从零开始计数,NR不清零,FNR读完一个文件后清零

3、行号后面列的顺序是在print中定义的,也可以定义先打1.txt的2列,后打2.txt的2列,改为{print a[1],0}即可。

把一个文件多行连接成一行http://ask.apelearn.com/question/266    命令示例:

wKiom1nkKrSDvKkjAAWj9flC9to292.png
wKiom1nkKrSDvKkjAAWj9flC9to292.png

%s 后记得要有一个空格,否则最后cat出来就是完全连在一起的,中间连空格都没有

应用举例:一个文件每行都有一个数字,现在需要把每行的数字用“+”连接起来,文件内容如下:

wKioL1nkKAHSjsfsAAh8hiZCeTA184.png
wKioL1nkKAHSjsfsAAh8hiZCeTA184.png

命令示例:awk '{printf("%s+"),$0}' 1.txt; echo ""

wKiom1nkKreyL6ZOAAGGCxJCyEk506.png
wKiom1nkKreyL6ZOAAGGCxJCyEk506.png

这里注意,最后一个是带“+”的。所以echo "" 的作用是换行。

另外还有一个实现这个需求的方法:

wKioL1nkKAKD-7yvAAJOO4BDYpo603.png
wKioL1nkKAKD-7yvAAJOO4BDYpo603.png

awk中gsub函数的使用http://ask.apelearn.com/question/200  命令示例:

awk 'gsub(/root/,"abc")' passwd

这个命令是把passwd文件中所有的root字符串替换为abc:

wKiom1nkKrnBBR9wAANsei59f0Q776.png
wKiom1nkKrnBBR9wAANsei59f0Q776.png

awk -F ':' 'gsub(/root/,"abc",

这个命令是把passwd文件中第一段的root字符串替换为abc:

wKiom1nkKrnhw0YcAAHmJmFal4k209.png
wKiom1nkKrnhw0YcAAHmJmFal4k209.png

awk 'sub(/root/,"abc") {print $0}' passwd

这个命令是把passwd文件中第一次出现的root字符串替换为abc:

wKioL1nkKAWTry1HAALQV8CVpuY512.png
wKioL1nkKAWTry1HAALQV8CVpuY512.png

awk 截取指定多个域为一行

http://ask.apelearn.com/question/224  命令示例:

wKiom1nkKuSTf4ZzAAVjmIt69C0474.png
wKiom1nkKuSTf4ZzAAVjmIt69C0474.png

过滤两个或多个关键词

http://ask.apelearn.com/question/198  命令示例:

grep -E '123|abc' filename

这个命令可以找出文件(filename)中包含123或者包含abc的行:

wKioL1nkKC7Bji1dAAMJMQ9hSyc422.png
wKioL1nkKC7Bji1dAAMJMQ9hSyc422.png

egrep '123|abc' filename

用egrep同样可以实现:

wKiom1nkKuXiMdA6AAMSYoR8pXs519.png
wKiom1nkKuXiMdA6AAMSYoR8pXs519.png

awk '/123|abc/' filename

awk 的实现方式:

wKiom1nkKueQUS1gAALLlV6m-O4768.png
wKiom1nkKueQUS1gAALLlV6m-O4768.png

用awk生成以下结构文件http://ask.apelearn.com/question/5494 

需求:

wKioL1nkKDKyN3NJAAUviv3BGSk916.png
wKioL1nkKDKyN3NJAAUviv3BGSk916.png

使用shell脚本完成这个需求:

1. #! /bin/bash

2. 

3. for i in `seq 1 5000000`; do

4.     n=`echo "

5.     export m=[10-n]

6.     export o=`perl -e 'a='0'; b=a x ENV{"m"}; print

7.     export j=$i

8.     p=`perl -e 'c=ENV{"o"}.ENV{"j"}; print

9.     echo "p,p,p,p,p,p,`date +%Y%m%d%H%M%S`"

        10. done

wKioL1nkKDWC9JOJAAatNUfPmGY324.png
wKioL1nkKDWC9JOJAAatNUfPmGY324.png

其中用到了perl,所以脚本整体看起来比较啰嗦,希望能找到更好的解决办法。 PS: shell 执行效率很低,so 该脚本运行时间会很漫长!

awk用print打印单引号http://ask.apelearn.com/question/1738  命令示例:

awk '{print "This is a '"'"'"

wKioL1nkKDyCo5w3AA98djwEOgA563.png
wKioL1nkKDyCo5w3AA98djwEOgA563.png

合并两个文件

http://ask.apelearn.com/question/945 

命令示例:paste filename1 filename

示例,我现在有两个文件内容如下:

wKioL1nkKF_jYbmSAAOtv7f4oRY216.png
wKioL1nkKF_jYbmSAAOtv7f4oRY216.png

paste 1.txt 2.txt的结果为:

wKiom1nkKxaySlXgAALcIoMw_0w425.png
wKiom1nkKxaySlXgAALcIoMw_0w425.png

如果你想在两个文件连接处用一个指定的字符连接,还可以使用-d选项来指定:

命令示例:paste -d ‘-’1.txt 2.txt

运行结果:

wKioL1nkKGHzkHRKAAMccAxN-UM722.png
wKioL1nkKGHzkHRKAAMccAxN-UM722.png

awk的参考教程

http://www.cnblogs.com/emanlee/p/3327576.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/10/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档