Linux中Awk常用文本处理命令用法详解

I. NR,FNR记录当前行

[root@LinuxEA awk]# cat nr1
1 a
2 b
3 c
4 d
5 e
[root@LinuxEA awk]# awk '{print FNR}' nr1
1
2
3
4
5
6
[root@LinuxEA awk]# awk '{print NR}' nr1
1
2
3
4
5
6
[root@LinuxEA awk]# awk '{print "行. = " NR " 数据 = " RNR,$0}' nr1
行. = 1 数据 =  1 a
行. = 2 数据 =  2 b
行. = 3 数据 =  3 c
行. = 4 数据 =  4 d
行. = 5 数据 =  5 e
行. = 6 数据 = 
[root@LinuxEA awk]#
II. AWK引入变量:

[root@LinuxEA awk]# VAR=linuxea
[root@LinuxEA awk]# awk -v var=$VAR 'BEGIN{print var}'
linuxea
[root@LinuxEA awk]# awk 'BEGIN{print "'$VAR'"}'
linuxea
[root@LinuxEA awk]#
III. OFS输出字段分隔符

[root@LinuxEA awk]# echo 'linuxea.com linuxea.com linuxea.com' |awk -v OFS="---" '{$1=$1;print $0}'
linuxea.com---linuxea.com---linuxea.com
[root@LinuxEA awk]#

[root@LinuxEA awk]# echo 'linuxea.com linuxea.com linuxea.com' |awk -v OFS="---" '{NF++0;print $0}'
linuxea.com---linuxea.com---linuxea.com---
[root@LinuxEA awk]# echo 'linuxea.com linuxea.com linuxea.com' |awk -v OFS="---" '{NF+=0;print $0}'
linuxea.com---linuxea.com---linuxea.com
[root@LinuxEA awk]#
IV. awk实现点分十进制的ip地址转换数字格式

[root@LinuxEA awk]# echo 8.8.8.8 |awk -F. '{n=0;for(i=1;i<=NF;i++){n*=256;n+=$i}print n}'
134744072
[root@LinuxEA awk]#
[root@LinuxEA awk]# echo 8.8.8.8|awk -F. '{printf "%d\n", ($1*(2^24))+($2*(2^16))+($3*(2^8))+$4}'
134744072
[root@LinuxEA awk]#
[root@LinuxEA awk]# ping 134744072
PING 134744072 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=66.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=76.9 ms
[root@LinuxEA awk]# echo 00001000.00001000.00001000.00001000|awk -F. 'function bin2dec(a,b,i,c){b=length(a);c=0;for(i=1;i<=b;i++){c+=c;if(substr(a,i,1)=="1")c++}return c}{for(j=1;j<=NF;j++)printf("%d%s",bin2dec($j),j!=NF?".":"\n")}'
8.8.8.8
[root@LinuxEA awk]#
V. 选择性打印

VI. 取其前一行

源文件:

[root@LinuxEA awk]# cat nr1
1 a
2 b
3 c
4 d
5 e
当pattern等于5时,打印前一行

[root@LinuxEA awk]# awk '!/5/{a=$0}/5/{print a}' nr1
4 d
[root@LinuxEA awk]# awk '/5/{print i};i=$0{}'
4 d
如果取前2行则借助一下属组,以前两行为例

[root@LinuxEA awk]# awk '{a[NR]=$0}/5/{p=NR}END{for(i=p-2;i<p;i++)print a[i] RS}' nr1
3 c

4 d
VII. 如果取其后两行

已知从3行开始,从3到5行内容

[root@LinuxEA awk]# awk '/3/{p=1;a=NR}p&&NR-x<=5&&NR-x>0' nr1
3 c
4 d
5 e
[root@LinuxEA awk]#
VIII. 取出现匹配次数

源数据:

[root@LinuxEA awk]# cat nr1
1 a
2 b
3 c
2 b
4 d
5 e
6 f
7 g

[root@LinuxEA awk]#
IX. 出现第一次匹配取后一行

[root@LinuxEA awk]# awk  '/2 b/{a++;b=NR}a==1&&NRb<=1 && NR-x>0' nr1
2 b
3 c
X. 出现第二次匹配,打印下面的行

[root@LinuxEA awk]# awk  '/2 b/{a++;b=NR}a==2&&NRb<=2 && NR-b>0' nr1
4 d
5 e
6 f
7 g

[root@LinuxEA awk]#
XI. 匹配中间数据

取出1 a 到4 d中间的数据

包括匹配行

[root@LinuxEA awk]# awk '/1 a/{p=1}/4 d/{print;p=0}p' nr1
1 a
2 b
3 c
2 b
4 d
[root@LinuxEA awk]#
不包括1 a行

[root@LinuxEA awk]# awk '/1 a/{p=1;next}/4 d/{print;p=0}p' nr1
2 b
3 c
2 b
4 d
[root@LinuxEA awk]#
不包括4 d行

[root@LinuxEA awk]# awk '/1 a/{p=1}/4 d/{p=0}p' nr1
1 a
2 b
3 c
2 b
[root@LinuxEA awk]#
不打印匹配行

[root@LinuxEA awk]# awk '/1 a/{p=1;next}/4 d/{p=0}p' nr1
2 b
3 c
2 b
[root@LinuxEA awk]#
XII. 过滤关键字中间的行

保留123(linuxea)和xaca(linuxea)中含有关键字的数据

实例文件

[root@LinuxEA awk]# cat file289
aaa
bbb
ccs
ddw
weq
123(linuxea)
szxc
sdaq
AZCA

SDQWQ
XXCA
ASDQ
XACA(linuxea)
BBB
[root@LinuxEA awk]#
保留123(linuxea)和xaca(linuxea)中含有关键字的数据

第一种方式:

将标签P作为数据下表,将123到结尾数据存入数组中,最后打印匹配linuxea值

[root@LinuxEA awk]# awk '/123/{p++}/./{a[p]=a[p]"\n"$0}END{for(i=1;i<=p;i++) if(a[i]~/\(linuxea\)/) print a[i]}' file289

123(linuxea)
szxc
sdaq
AZCA
SDQWQ
XXCA
ASDQ
XACA(linuxea)
BBB
[root@LinuxEA awk]#
第二种方式:

利用awk内置函数RS

[root@LinuxEA awk]# awk -v RS="123" '/linuxea/{print RS $0}' file289
123(linuxea)
szxc
sdaq
AZCA

SDQWQ
XXCA
ASDQ
XACA(linuxea)
BBB

[root@LinuxEA awk]#
XIII. 统计关键字的行

[root@LinuxEA awk]# cat file299
head no
1235 linuxea mark 1 @09    linuxea.com
1235 mark
head no
1234 mark linuxea.com
1235 mark
1235 mark linuxea.com
head no
1235 mark linuxea.com
1235 mark
1235 mark linuxea.com
1235 mark linuxea.com
统计linuxea.com的行数

[root@LinuxEA awk]# awk '/no/{p++;b[p]=$0}/linuxea.com/{a[p]++}END{for(i=1;i<=p;i++) print b[i],a[i]}' file299
head no 1
head no 2
head no 3
[root@LinuxEA awk]#
XIV. 打印奇数偶数行数

[root@LinuxEA awk]# cat file2991
1
2
3
4
5
6
7
8
9
10
[root@LinuxEA awk]# awk p++%2 file2991
2
4
6
8
10
[root@LinuxEA awk]# awk ++p%2 file2991
1
3
5
7
9
## 打印匹配关键字的行号
linuxea.com

[root@LinuxEA awk]# cat 1006
123
abc
aaaa
vwd
vvvvvv
deafwq
linuxea.com
dddddddddd
aaaaaaa
打印关键字vwd后出现的第一个linuxea.com所处行的行号

[root@LinuxEA awk]# awk '/linuxea.com/{p=NR}/vwd/{x=NR}p>x&&x>0{print p;exit}' 1006
7
[root@LinuxEA awk]#
XV. 取其关键字后N行

[root@LinuxEA awk]# awk '/vwd/{i=3;next}--i>=0' 1006
vvvvvv
deafwq
linuxea.com
[root@LinuxEA awk]#
取其关键字前三行

[root@LinuxEA awk]# awk '/\<vwd\>/{for(i=NR-3;i<NR;i++)print a[i%3];exit}{a[NR%3]=$0}' 1006
123
abc
aaaa
[root@LinuxEA awk]# awk '{a[NR]=$0}/\<vwd\>/{for(i=NR-3;i<NR;i++)print a[i]}' 1006 
123
abc
aaaa
[root@LinuxEA awk]# awk '{a[NR]=$0}/vwd/{p=NR}END{for(i=p-3;i<p;i++) printf a[i] RS}' 1006
123
abc
aaaa
[root@LinuxEA awk]# awk '{a[NR]=$0}/vwd/{for(i=NR-3;i<NR;i++)print a[i]}' 1006
123
abc
aaaa
[root@LinuxEA awk]#

时间: 2024-08-01 10:22:52

Linux中Awk常用文本处理命令用法详解的相关文章

linux下history(历史)命令用法详解

 如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的15个用法. 1. 使用 HISTTIMEFORMAT 显示时间戳 当你从命令行执行 history 命令后,通常只会显示已执行命令的序号和命令本身.如果你想要查看命令历史的时间戳,那么可以执行: # export HISTTIMEFORMAT='%F %T ' # history | more 1 2008-08-05 19:02:39 serv

常用Linux命令mkdir命令用法详解

mkdir命令我们在操作Linux运维管理和网站部署的时候使用的还是比较多的,主要是用来创建指定的目录文件夹.比如老蒋在之前有博客文章中提到挂载数据硬盘的时候,我们需要创建home或者www目录文件夹,那时候我们就使用的mkdir命令.当然,我们也可以使用SFTP工具进行可视化创建,稍微显得笨重和麻烦一点. 第一.命令格式 mkdir [参数] [目录] 主要功能就是我们创建目录,或者可以赋予权限. 第二.命令参数 1.-m 设定文件夹目录权限 2.-p 创建目录路径,我们也可以一次创建多个目录

《Ansible权威指南》一2.4 Ansible系列命令用法详解与使用场景介绍

2.4 Ansible系列命令用法详解与使用场景介绍 如何获取Ansible的系列命令呢?在终端键入ansible后连续按两次Tab键,会补全所有以ansible字母开头的命令,这些命令均是Ansible系列命令.本节我们来逐一介绍Ansible的系列命令使用. ansible ansible-galaxy ansible-pull ansible-doc ansible-playbook ansible-vault ansible-console 2.4.1 ansible 命令ansible

《Ansible权威指南 》一Ansible命令用法详解

2.3 Ansible命令用法详解 Ansible命令行执行方式有Ad-Hoc.Ansible-playbook两种方式,Web化执行方式其官方提供了付费产品Tower(10台以内免费),个人的话可以基于其提供的API开发类似的Web化产品.关于命令行执行的两种方式Ad-Hoc和Ansible-playbooks.什么是Ad-Hoc及Ad-Hoc与Ansible-playbook的区别我们在第3章有详细介绍,这里不再赘述.需简要说明的是两者没有本质上的区别,Ad-Hoc主要用于临时命令的执行,A

《Ansible权威指南》一2.3 Ansible命令用法详解

2.3 Ansible命令用法详解 Ansible命令行执行方式有Ad-Hoc.Ansible-playbook两种方式,Web化执行方式其官方提供了付费产品Tower(10台以内免费),个人的话可以基于其提供的API开发类似的Web化产品.关于命令行执行的两种方式Ad-Hoc和Ansible-playbooks.什么是Ad-Hoc及Ad-Hoc与Ansible-playbook的区别我们在第3章有详细介绍,这里不再赘述.需简要说明的是两者没有本质上的区别,Ad-Hoc主要用于临时命令的执行,A

CSS中伪类及伪元素用法详解

原文:CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的读者可以自己尝试:   :active  大致效果为用鼠标点击时,元素增加特效,鼠标松开时,特效消失.多用在按钮的点击上.  写法: 这里id为box的是一div块,在css中首先设置了他的基本样式,下面为加入:active伪类后需要修改的样式. 未点击时: 点击之后: :active.:hove

Java中volatile关键字的作用与用法详解_java

volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile 关键字作用是,使系统中所有线程对该关键字修饰的变量共享可见,可以禁止线程的工作内存对volatile修饰的变量进行缓存. volatile 2个使用场景: 1.可见性:Java提供了volatile关键字来保证可见性. 当一个共享变量被volatile修饰时,它会保证修

Mysql导入导出工具Mysqldump和Source命令用法详解_Mysql

在PHP网站开发中,时常遇到Mysql数据库备份或数据库迁移工作,这时Mysql怎么导入导出数据库中的数据就非常关键,Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式(txt)的SQL文件,通过Mysql Source命令能够将SQL文件导入Mysql数据库中,下面通过Mysql导入导出SQL实例详解Mysqldump和Source命令的用法. M

Linux中tail命令用法详解_Linux

tail命令也是一个非常常用的文件查看类的命令,今天就为大家介绍下Linux tail命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux tail命令主要用来从指定点开始将文件写到标准输出.很多人喜欢使用tail –f 来监控日志文件. 一.Linux tail命令格式 Linux tail命令 格式如下所示 tail [OPTION]... [FILE]... Linux tail命令 参数如下所示 -f 循环读取 -q 不显示处理信息 -v 显示详细的处理信息 -c