热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

awk内嵌正则提取字符串_Linux三剑客之awk详解

(给Linux爱好者加星标,提升Linux技能)以下文章来源于宜信技术学院,作者秦伟第一篇awk简介与表达式实例一种名字怪异的语言模式扫描和处理

(给Linux爱好者加星标,提升Linux技能)

以下文章来源于宜信技术学院 ,作者秦伟

第一篇 awk简介与表达式实例

  • 一种名字怪异的语言

  • 模式扫描和处理,处理数据和生成报告。

awk不仅仅是linux系统中的一个命令,而且是一种编程语言;它可以用来处理数据和生成报告(excel);处理的数据可以是一个或多个文件;可以是直接来自标准输入,也可以通过管道获取标准输入;awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用。

sed处理stream editor文本流,水流。

一、awk环境简介

本文涉及的awk为gawk,即GNU版本的awk。

[root@creditease awk]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@creditease awk]# uname -r3.10.0-862.el7.x86_64
[root@creditease awk]# ll `which awk`
lrwxrwxrwx. 1 root root 4 Nov 7 14:47 /usr/bin/awk -> gawk
[root@creditease awk]# awk --version
GNU Awk 4.0.2

二、awk的格式

awk指令是由模式、动作,或者模式和动作的组合组成。

0a48c4b68d84577e09deabd0a5d07948.png

edf057e0f7561dc0b955974b8f6be407.png

  • 模式即pattern,可以类似理解成sed的模式匹配,可以由表达式组成,也可以是两个正斜杠之间的正则表达式。比如NR==1,这就是模式,可以把它理解为一个条件。

  • 动作即action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开。如下awk使用格式。

三、记录和域

名称含义
record记录,行
filed域,区域,字段,列
  1. NF(number of field)表示一行中的区域(列)数量,$NF取最后一个区域。

  2. $符号表示取某个列(区域),$1,$2,$NF

  3. NR (number of record) 行号,awk对每一行的记录号都有一个内置变量NR来保存,每处理完一条记录NR的值就会自动+1

  4. FS(-F)field separator 列分隔符,以什么把行分隔成多列

3.1 指定分隔符

[root@creditease awk]# awk -F "#" '{print $NF}' awk.txt
GKL$123
GKL$213
GKL$321
[root@creditease awk]# awk -F '[#$]' '{print $NF}' awk.txt123213321

3.2 条件动作基本的条件和动作

[root@creditease awk]# cat awk.txt
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" 'NR==1{print $1}' awk.txt
ABC

3.3 只有条件

[root@creditease awk]# awk -F "#" 'NR==1' awk.txt
ABC#DEF#GHI#GKL$123

默认会有动作{print $0}

3.4 只有动作

[root@creditease awk]# awk -F "#" '{print $1}' awk.txt
ABC
BAC
CAB

默认处理所有行

3.5 多个模式和动作

[root@creditease awk]# awk -F "#" 'NR==1{print $NF}NR==3{print $NF}' awk.txt
GKL$123
GKL$321

3.6 对$0的认识

awk中$0表示整行

[root@creditease awk]# awk '{print $0}' awk_space.txt
ABC DEF GHI GKL$123
BAC DEF GHI GKL$213
CBA DEF GHI GKL$321

3.7 FNR

FNR与NR类似,不过多文件记录不递增,每个文件都从1开始(后边处理多文件会讲到)

[root@creditease awk]# awk '{print NR}' awk.txt awk_space.txt123456
[root@creditease awk]# awk '{print FNR}' awk.txt awk_space.txt123123

四、正则表达式与操作符

awk同sed一样也可以通过模式匹配来对输入的文本进行匹配处理。awk也支持大量的正则表达式模式,大部分与sed支持的元字符类似,而且正则表达式是玩转三剑客的必备工具。

awk支持的正则表达式元字符

6d46673077c2b748cb6aa1758ebecc58.png

awk默认不支持的元字符,和需要添加参数才能支持的元字符

6380fef42a2337f4a4ee322bb7557059.png

正则表达式的运用,默认是在行内查找匹配的字符串,若有匹配则执行action操作,但是有时候仅需要固定的列表匹配指定的正则表达式。

比如:

我想取/etc/passwd文件中第五列($5)这一列查找匹配mail字符串的行,这样就需要用另外两个匹配操作符。并且awk里面只有这两个操作符来匹配正则表达式的。

正则匹配操作符
~用于对记录或区域的表达式进行匹配。
!~用于表达与~相反的意思。

4.1 正则实例

1)显示awk.txt中GHI列

[root@creditease awk]# cat awk.txt
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '{print $3}' awk.txt
GHI
GHI
GHI
[root@creditease awk]# awk -F "#" '{print $(NF-1)}' awk.txt
GHI
GHI
GHI

2)显示包含321的行

[root@creditease awk]# awk '/321/{print $0}' awk.txt
CBA#DEF#GHI#GKL$321

3)以#为分隔符,显示第一列以B开头或最后一列以1结尾的行

[root@creditease awk]# awk -F "#" '$1~/^B/{print $0}$NF~/1$/{print $0}' awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

4)以#为分隔符,显示第一列以B或C开头的行

[root@creditease awk]# awk -F "#" '$1~/^B|^C/{print $0}' awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1~/^[BC]/{print $0}' awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1~/^(B|C)/{print $0}' awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root@creditease awk]# awk -F "#" '$1!~/^A/{print $0}' awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

五、比较表达式

awk是一种编程语言,能够进行更为复杂的判断,当条件为真时,awk就执行相关的action,主要是在针对某一区域做出相关的判断,比如打印成绩在80分以上的,这样就必须对这一个区域作比较判断.

下表列出了awk可以使用的关系运算符,可以用来比较数字字符串,还有正则表达式,当表达式为真的时候,表达式结果为1,否则为0,只有表达式为真,awk才执行相关的action。

awk支持的关系运算符

运算符含义示例
<小于x>y
<&#61;小于或等于。x<&#61;y
&#61;&#61;等于x&#61;&#61;y
!&#61;不等于x!&#61;y
>&#61;大于或等于x>&#61;y
>大于x

5.1 比较表达式实例

显示awk.txt的第2 ,3 行

NR //,//

[root&#64;creditease awk]# awk &#39;NR&#61;&#61;2{print $0}NR&#61;&#61;3{print $0}&#39; awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root&#64;creditease awk]# awk &#39;NR>&#61;1{print $0}&#39; awk.txt
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
[root&#64;creditease awk]# awk &#39;/BAC/,/CBA/{print $0}&#39; awk.txt
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

第二篇 awk模块、变量与执行

完整awk结构图如下&#xff1a;

20f92d8955db351b02673a454c4e7c1b.png

一、BEGIN模块

BEGIN模块在awk读取文件之前就执行&#xff0c;BEGIN模式常常被用来修改内置变量ORS&#xff0c;RS&#xff0c;FS&#xff0c;OFS等的值。可以不接任何输入文件

二、awk内置变量(预定义变量)

变量名属性

变量名属性
$0当前记录&#xff0c;一整行
$1,$2,$3....$a当前记录的第n个区域&#xff0c;区域间由FS分隔。
FS输入区域分隔符&#xff0c;默认是空格。field separator
NF当前记录中的区域个数&#xff0c;就是有多少列。number of field
NR已经读出的记录数&#xff0c;就是行号&#xff0c;从1开始。number of record
RS输入的记录分隔符默认为换行符。record separator
OFS输出区域分隔符&#xff0c;默认也是空格。output record separator
FNR当前文件的读入记录号&#xff0c;每个文件重新计算。
FILENAME当前正在处理的文件的文件名

特别提示&#xff1a;FS RS支持正则表达式

2.1 第一个作用: 定义内置变量

[root&#64;creditease awk]# awk &#39;BEGIN{RS&#61;"#"}{print $0}&#39; awk.txt
ABC
DEF
GHI
GKL$123
BAC
DEF
GHI
GKL$213
CBA
DEF
GHI
GKL$321

2.2 第二个作用:打印标识

[root&#64;creditease awk]# awk &#39;BEGIN{print "&#61;&#61;&#61;&#61;&#61;&#61;&#61;start&#61;&#61;&#61;&#61;&#61;&#61;"}{print $0}&#39; awk.txt
&#61;&#61;&#61;&#61;&#61;&#61;&#61;start&#61;&#61;&#61;&#61;&#61;&#61;
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

2.3 awk实现计算功能

[root&#64;creditease files]# awk &#39;BEGIN{a&#61;8;b&#61;90;print a&#43;b,a-c,a/b,a%b}&#39;98 8 0.0888889 8

三、END模块

END在awk读取完所有的文件的时候&#xff0c;再执行END模块&#xff0c;一般用来输出一个结果(累加&#xff0c;数组结果)。也可以是和BEGIN模块类似的结尾标识信息。

3.1 第一个作用&#xff1a;打印标识

[root&#64;creditease awk]# awk &#39;BEGIN{print "&#61;&#61;&#61;&#61;&#61;&#61;&#61;start&#61;&#61;&#61;&#61;&#61;&#61;"}{print $0}END{print "&#61;&#61;&#61;&#61;&#61;&#61;&#61;end&#61;&#61;&#61;&#61;&#61;&#61;"}&#39; awk.txt
&#61;&#61;&#61;&#61;&#61;&#61;&#61;start&#61;&#61;&#61;&#61;&#61;&#61;
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
&#61;&#61;&#61;&#61;&#61;&#61;&#61;end&#61;&#61;&#61;&#61;&#61;&#61;

3.2 第二个作用&#xff1a;累加

1)统计空行(/etc/services文件)

grep sed awk

[root&#64;creditease awk]# grep "^$" /etc/services |wc -l17
[root&#64;creditease awk]# sed -n &#39;/^$/p&#39; /etc/services |wc -l17
[root&#64;creditease awk]# awk &#39;/^$/&#39; /etc/services |wc -l17
[root&#64;creditease awk]# awk &#39;/^$/{i&#61;i&#43;1}END{print i}&#39; /etc/services17

2)算术题

1&#43;2&#43;3......&#43;100&#61;5050&#xff0c;怎么用awk表示&#xff1f;

[root&#64;creditease awk]# seq 100|awk &#39;{i&#61;i&#43;$0}END{print i}&#39;5050

四、awk详解小结

1、BEGIN和END模块只能有一个&#xff0c;BEGIN{}BEGIN{}或者END{}END{}都是错误的。

2、找谁干啥模块&#xff0c;可以是多个。

五、awk执行过程总结

4b989708d4fc7aee6c3f2309b2a2ec30.png

awk执行过程&#xff1a;

1、命令行的赋值(-F或-V)

2、执行BEGIN模式里面的内容

3、开始读取文件

4、判断条件(模式)是否成立

成立则执行对应动作里面的内容

读取下一行&#xff0c;循环判断

直到读取到最后一个文件的结尾

5、最后执行END模式里面的内容

第三篇&#xff1a;awk数组与语法

一、awk数组

1.1 数组结构

b3b8b91f18a89a6ca472363b7a0924e2.png

people[police]&#61;110

people[doctor]&#61;120

[root&#64;creditease awk]# awk &#39;BEGIN{word[0]&#61;"credit";word[1]&#61;"easy";print word[0],word[1]}&#39;
credit easy
[root&#64;creditease awk]# awk &#39;BEGIN{word[0]&#61;"credit";word[1]&#61;"easy";for(i in word)print word[i]}&#39;
credit
easy

1.2 数组分类

索 引数组&#xff1a;以数字为下标

关联数组&#xff1a;以字符串为下标

1.3 awk关联数组

现有如下文本&#xff0c;格式如下&#xff1a;即左边是随机字母&#xff0c;右边是随机数字, 即将相同的字母后面的数字加在一起&#xff0c;按字母的顺序输出

a 1
b 3
c 2
d 7
b 5
a 3
g 2
f 6

以$1为下标&#xff0c;创建数组a[$1]&#61;a[$1]&#43;$2(a[$1]&#43;&#61;$2)然后配合END和for循环输出结果&#xff1a;

[root&#64;creditease awk]# awk &#39;{a[$1]&#61;a[$1]&#43;$2}END{for(i in a)print i,a[i]}&#39; jia.txt
a 4
b 8
c 2
d 7
f 6
g 2
注意&#xff1a;for(i in a) 循环的顺序不是按照文本内容的顺序来处理的&#xff0c;排序可以在命令后加sort排序

1.4 awk索引数组

以数字为下标的数组 seq生成1-10的数字&#xff0c;要求只显示计数行

[root&#64;creditease awk]# seq 10|awk &#39;{a[NR]&#61;$0}END{for(i&#61;1;i<&#61;NR;i&#43;&#61;2){print a[i]}}&#39;13579

seq生成1-10的数字&#xff0c;要求不显示文件的后3行

[root&#64;creditease awk]# seq 10|awk &#39;{a[NR]&#61;$0}END{for(i&#61;1;i<&#61;NR-3;i&#43;&#43;){print a[i]}}&#39;1234567
解析&#xff1a;改变i的范围即可&#xff0c;多用于不显示文件的后几行

1.5 awk数组实战去重

a&#43;&#43; 和 &#43;&#43;a

[root&#64;creditease awk]# awk &#39;BEGIN{print a&#43;&#43;}&#39;0
[root&#64;creditease awk]# awk &#39;BEGIN{print &#43;&#43;a}&#39;1
[root&#64;creditease awk]# awk &#39;BEGIN{a&#61;1;b&#61;a&#43;&#43;;print a,b}&#39;2 1
[root&#64;creditease awk]# awk &#39;BEGIN{a&#61;1;b&#61;&#43;&#43;a;print a,b}&#39;2 2
注&#xff1a;
都是 b &#61; a&#43;1
b&#61;a&#43;&#43; 先把 a 的值赋予b&#xff0c;然后 a &#43; 1
b&#61;&#43;&#43;a 先执行a&#43;1,然后把a的值赋予b

对一下文本进行去重处理 针对第二列去重

[root&#64;creditease awk]# cat qc.txt2018/10/20 xiaoli 133733050252018/10/25 xiaowang 177122159862018/11/01 xiaoliu 18615517895 2018/11/12 xiaoli 133733050252018/11/19 xiaozhao 155120132632018/11/26 xiaoliu 186155178952018/12/01 xiaoma 169655645252018/12/09 xiaowang 177122159862018/11/24 xiaozhao 15512013263

解法一&#xff1a;
[root&#64;creditease awk]# awk &#39;!a[$2]&#43;&#43;&#39; qc.txt2018/10/20 xiaoli 133733050252018/10/25 xiaowang 177122159862018/11/01 xiaoliu 18615517895 2018/11/19 xiaozhao 155120132632018/12/01 xiaoma 16965564525
解析&#xff1a;
!a[$3]&#43;&#43;是模式(条件)&#xff0c;命令也可写成awk &#39;!
a[$3]&#61;a[$3]&#43;1{print $0}&#39; qc.txt
a[$3]&#43;&#43; &#xff0c;“&#43;&#43;”在后&#xff0c;先取值后加一
!a[$3]&#61;a[$3]&#43;1&#xff1a;是先取a[$3]的值&#xff0c;比较“&#xff01;a[$3]”是否符合条件(条件非0)&#xff0c;后加1
注意&#xff1a;此方法去重后的结果显示的是文本开头开始的所有不重复的行
解法二&#xff1a;
[root&#64;creditease awk]# awk &#39;&#43;&#43;a[$2]&#61;&#61;1&#39; qc.txt2018/10/20 xiaoli 133733050252018/10/25 xiaowang 177122159862018/11/01 xiaoliu 18615517895 2018/11/19 xiaozhao 155120132632018/12/01 xiaoma 16965564525
解析&#xff1a;
&#43;&#43;a[$3]&#61;&#61;1是模式(条件)&#xff0c;也可写成a[$3]&#61;a[$3]&#43;1&#61;&#61;1即只有当条件(a[$3]&#43;1的结果)为1的时候才打印出内容
&#43;&#43;a[$3] &#xff0c;“&#43;&#43;”在前&#xff0c;先加一后取值
&#43;&#43;a[$3]&#61;&#61;1&#xff1a;是先加1&#xff0c;后取a[$3]的值&#xff0c;比较“&#43;&#43;a[$3]”是否符合条件(值为1)
注意&#xff1a;此方法去重后的结果显示的是文本开头开始的所有不重复的行
解法三&#xff1a;
[root&#64;creditease awk]# awk &#39;{a[$2]&#61;$0}END{for(i in a){print a[i]}}&#39; qc.txt2018/11/12 xiaoli 133733050252018/11/26 xiaoliu 186155178952018/12/01 xiaoma 169655645252018/12/09 xiaowang 177122159862018/11/24 xiaozhao 15512013263
解析&#xff1a;
注意此方法去重后的结果显示的是文本结尾开始的所有不重复的行

1.6 awk处理多个文件(数组、NR、FNR)

使用awk取file.txt的第一列和file1.txt的第二列然后重定向到一个新文件new.txt中

[root&#64;creditease awk]# cat file1.txt
a b
c d
e f
g h
i j
[root&#64;creditease awk]# cat file2.txt1 23 45 67 89 10
[root&#64;creditease awk]# awk &#39;NR&#61;&#61;FNR{a[FNR]&#61;$1}NR!&#61;FNR{print a[FNR],$2}&#39; file1.txt file2.txt
a 2
c 4
e 6
g 8
i 10
解析&#xff1a;NR&#61;&#61;FNR处理的是第一个文件&#xff0c;NR!&#61;FNR处理的是第二个文件.
注意&#xff1a;当两个文件NR(行数)不同的时候&#xff0c;需要把行数多的放前边.
解决方法&#xff1a;把行数多的文件放前边&#xff0c;行数少的文件放后边.
把输出的结果放入一个新文件new.txt中&#xff1a;
[root&#64;creditease awk]# awk &#39;NR&#61;&#61;FNR{a[FNR]&#61;$1}NR!&#61;FNR{print a[FNR],$2>"new.txt"}&#39; file1.txt file2.txt
[root&#64;creditease awk]# cat new.txt
a 2
c 4
e 6
g 8
i 10

1.7 awk分析日志文件&#xff0c;统计访问网站的个数

[root&#64;creditease awk]# cat url.txt
http://www.baidu.com
http://mp4.video.cn
http://www.qq.com
http://www.listeneasy.com
http://mp3.music.com
http://www.qq.com
http://www.qq.com
http://www.listeneasy.com
http://www.listeneasy.com
http://mp4.video.cn
http://mp3.music.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
[root&#64;creditease awk]# awk -F "[/]&#43;" &#39;{h[$2]&#43;&#43;}END{for(i in h) print i,h[i]}&#39; url.txt
www.qq.com 3
www.baidu.com 5
mp4.video.cn 2
mp3.music.com 2
www.crediteasy.com 3

二、awk简单语法

2.1 函数sub gsub

替换功能

格式&#xff1a;sub(r, s ,目标) gsub(r, s ,目标)

[root&#64;creditease awk]# cat sub.txt
ABC DEF AHI GKL$123
BAC DEF AHI GKL$213
CBA DEF GHI GKL$321
[root&#64;creditease awk]# awk &#39;{sub(/A/,"a");print $0}&#39; sub.txt
aBC DEF AHI GKL$123
BaC DEF AHI GKL$213
CBa DEF GHI GKL$321
[root&#64;creditease awk]# awk &#39;{gsub(/A/,"a");print $0}&#39; sub.txt
aBC DEF aHI GKL$123
BaC DEF aHI GKL$213
CBa DEF GHI GKL$321
注&#xff1a;sub只会替换行内匹配的第一次内容&#xff1b;相当于sed ‘s###’
gsub 会替换行内匹配的所有内容&#xff1b;相当于sed ‘s###g’
[root&#64;creditease awk]# awk &#39;{sub(/A/,"a",$1);print $0}&#39; sub.txt
aBC DEF AHI GKL$123
BaC DEF AHI GKL$213
CBa DEF GHI GKL$321

练习&#xff1a;

0001|20081223efskjfdj|EREADFASDLKJCV0002|20081208djfksdaa|JDKFJALSDJFsddf0003|20081208efskjfdj|EREADFASDLKJCV0004|20081211djfksdaa1234|JDKFJALSDJFsddf
以&#39;|&#39;为分隔&#xff0c; 现要将第二个域字母前的数字去掉&#xff0c;其他地方都不变&#xff0c; 输出为&#xff1a;0001|efskjfdj|EREADFASDLKJCV0002|djfksdaa|JDKFJALSDJFsddf0003|efskjfdj|EREADFASDLKJCV0004|djfksdaa1234|JDKFJALSDJFsddf
方法&#xff1a;
awk -F &#39;|&#39; &#39;BEGIN{OFS&#61;"|"}{sub(/[0-9]&#43;/,"",$2);print $0}&#39; sub_hm.txt
awk -F &#39;|&#39; -v OFS&#61;"|" &#39;{sub(/[0-9]&#43;/,"",$2);print $0}&#39; sub_hm.txt

2.2 if和slse的用法

内容&#xff1a;

AA

BC

AA

CB

CC

AA

结果&#xff1a;

AA YES

BC NO YES

AA YES

CB NO YES

CC NO YES

AA YES

1) [root&#64;creditease awk]# awk &#39;{if($0~/AA/){print $0" YES"}else{print $0" NO YES"}}&#39; ifelse.txt
AA YES
BC NO YES
AA YES
CB NO YES
CC NO YES
AA YES
解析&#xff1a;使用if和else&#xff0c;if $0匹配到AA&#xff0c;则打印$0 "YES"&#xff0c;else反之打印$0 " NO YES"。2)[root&#64;creditease awk]# awk &#39;$0~/AA/{print $0" YES"}$0!~/AA/{print $0" NO YES"}&#39; ifelse.txt
AA YES
BC NO YES
AA YES
CB NO YES
CC NO YES
AA YES
解析&#xff1a;使用正则匹配&#xff0c;当$0匹配AA时&#xff0c;打印出YES&#xff0c;反之&#xff0c;打印出“NO YES”

2.3 next用法

如上题&#xff0c;用next来实现

next &#xff1a;跳过它后边的所有代码

[root&#64;creditease awk]# awk &#39;$0~/AA/{print $0" YES";next}{print $0" NO YES"}&#39; ifelse.txt
AA YES
BC NO YES
AA YES
CB NO YES
CC NO YES
AA YES
解析&#xff1a;
{print $0" NO YES"}&#xff1a;此动作是默认执行的&#xff0c;当前边的$0~/AA/匹配&#xff0c;就会执行{print $0" YES";next}
因为action中有next&#xff0c;所以会跳过后边的action。
如果符合$0~/AA/则打印YES &#xff0c;遇到next后&#xff0c;后边的动作不执行&#xff1b;如果不符合$0~/AA/&#xff0c;会执行next后边的动作&#xff1b;
next前边的(模式匹配)&#xff0c;后边的就不执行&#xff0c;前边的不执行(模式不匹配)&#xff0c;后边的就执行。

2.4 printf不换行输出以及next用法

printf &#xff1a;打印后不换行

如下文本&#xff0c;如果 Description&#xff1a;之后为空&#xff0c;将其后一行内容并入此行。

Packages: Hello-1
Owner: me me me me
Other: who care?
Description:
Hello world!
Other2: don&#39;t care
想要结果&#xff1a;
Packages: Hello-1
Owner: me me me me
Other: who care?
Description: Hello world!
Origial-Owner: me me me me
Other2: don&#39;t care1)[root&#64;creditease awk]# awk &#39;/^Desc.*:$/{printf $0}!/Desc.*:$/{print $0}&#39; printf.txt
Packages: Hello-1
Owner: me me me me
Other: who care?
Description:Hello world!
Other2: don&#39;t care
解析&#xff1a;使用正则匹配&#xff0c;匹配到&#39;/^Desc.*:$/&#xff0c;就使用printf打印(不换行)&#xff0c;不匹配的打印出整行。
2)使用if和else实现
[root&#64;creditease awk]# awk &#39;{if(/Des.*:$/){printf $0}else{print $0}}&#39; printf.txt
Packages: Hello-1
Owner: me me me me
Other: who care?
Description:Hello world!
Other2: don&#39;t care3)使用next实现
[root&#64;creditease awk]# awk &#39;/Desc.*:$/{printf $0;next}{print $0}&#39; printf.txt
Packages: Hello-1
Owner: me me me me
Other: who care?
Description:Hello world!
Other2: don&#39;t care
注&#xff1a;可简写成awk &#39;/Desc.*:$/{printf $0;next}1&#39;printf.txt ## 1是pattern(模式)&#xff0c;默认action(动作)是{print $0}

2.5 去重后计数按要求重定向到指定文件

文本如下&#xff0c;要求计算出每项重复的个数&#xff0c;然后把重复次数大于2的放入gt2.txt文件中&#xff0c;把重复次数小于等于2的放入le2.txt文件中

[root&#64;creditease files]# cat qcjs.txt
aaa
bbb
ccc
aaa
ddd
bbb
rrr
ttt
ccc
eee
ddd
rrr
bbb
rrr
bbb
[root&#64;creditease awk]# awk &#39;{a[$1]&#43;&#43;}END{for(i in a){if(a[i]>2){print i,a[i]>"gt2.txt"}else{print i,a[i]>"le2.txt"}}}&#39; qcjs.txt
[root&#64;creditease awk]# cat gt2.txt
rrr 3
bbb 4
[root&#64;creditease awk]# cat le2.txt
aaa 2
ccc 2
eee 1
ttt 1
ddd 2
解析&#xff1a;{print },或括号中打印后可直接重定向到一个新文件&#xff0c;文件名用双引号引起来。如: {print $1 >"xin.txt"}

三、awk需注意事项

a)NR&#61;&#61;FNR ##不能写成NR&#61;FNR(&#61;在awk中是赋值的意思)

b)NR!&#61;FNR ##NR不等于FNR

c){a&#61;1;a[NR]} 这样会报错&#xff1a;同一条命令中变量和数组名不能重复 d)printf 输出的时候不换行

e){print },或括号中打印后可直接重定向到一个新文件&#xff0c;文件名用双引号引起来。如: {print $1 >"xin.txt"}

f)当模式(条件)是0的时候&#xff0c;后边的动作不执行&#xff0c;&#xff01;0的时候后边动作才执行。

推荐阅读

(点击标题可跳转阅读)

Linux Awk命令详解

Linux Shell Awk 流程控制语句详细介绍

详解 awk 工具的使用方法

看完本文有收获&#xff1f;请分享给更多人

关注「Linux 爱好者」加星标&#xff0c;提升Linux技能

1c2e455af2cec5a5260385212db1e275.png

好文章&#xff0c;我在看❤️




推荐阅读
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
author-avatar
到地球来旅行
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有