详解著名的awk Oneliner,第三部分:选择性输出特定行

详解著名的awk Oneliner,第三部分:选择性输出特定行

输出文件的前10行(模拟 head -n 10 )

awk ‘ NR < 11 ‘ 

如前所述,这里省略了动作,即为打印输出。匹配模式是变量NR需要小于11,NR即为当前的行号。这个写法很简单,但是有一个问题,在NR大于10的时候,awk其实还是对每行进行了判断,如果文件很大,比如说有上万行,浪费的时间是无法忽略的。所以,更好的写法是

awk ‘1; NR = 10 { exit }‘ 

第一句对当前行进行输出。第二句判断是不是已经到了第10行,如果是则退出。

输出文件的第一行(模拟 head -n 1 )

awk ‘NR > 1 { exit }; 1‘ 

这个例子与前一个很相似,中心思想就是第二行就退出。

输出文件的最后两行(模拟 tail -n 2 )

awk ‘{ y=x "\n" $0; x=$0}; END { print y }‘ 

的确,这一句看起来确实有些别扭。第一句总是把一个在当前行前面再加上变量x的内容赋值给y,然后用x记录当前行内容。这样的效果是y的内容始终是上一行加上当前行的内容。在最后,输出y的内容。如果仔细看的话,不难发现这个写法是很不高效的,因为它不停的进行赋值和字符串连接,只为了找到最后一行!所以,如果你想要输出文件的最后两行,tail -n 2是最好的选择。

输出文件的最后一行(模拟 tail -n 1 )

awk ‘END { print }‘ 

句法方面没什么好说的,print省略参数即是等价于print $0。但是这个语句可能不能被非GNU awk的某些awk版本正常执行,如果为了兼容,下面的写法是最安全的:

awk ‘{ rec = $0 }; END { print rec }‘ 

输出只匹配某些模式的行(模拟 grep )

awk ‘/regex/‘ 

似乎没什么好说的了。

输出不匹配某些模式的行(模拟 grep -v )

awk ‘!/regex/‘ 

匹配模式前加“!”就是否定判断结果。

输出匹配模式的行的上一行,而非当前行

awk ‘/regex/ { print x }; { x = $0 }‘ 

变量x总是用来记录上一行的内容,如果模式匹配了当前行,则输出x的内容。

输出匹配模式的下一行

awk ‘/regex/ { getline; print }‘ 

这里使用了getline函数取得下一行的内容并输出。getline的作用是将$0的内容置为下一行的内容,并同时更新NR,NF,FNR变量。如果匹配的是最后一行,getline会出错,$0不会被更新,最后一行会被打印。

输出匹配AA或者BB或者CC的行

awk ‘/AA|BB|CC/‘ 

没什么好说的,正则表达式。如果有看不懂的朋友,请自行学习正则表达式。

输出长过65个字符的行

awk ‘length > 64‘ 

length([str])返回字符串的长度,如果参数省略,即是以$0作为参数,括号也可以省略了。

输出短于65个字符的行

awk ‘length < 65‘ 

和上例基本一样。

输出从匹配行到最后一样的内容

awk ‘/regex/,0‘ 

这里使用了“pattern1,pattern2”的形式来指定一个匹配的范围,其中pattern2这里为0,也就是false,所以一直会匹配到文件结束。

从第8行输出到第12行

awk ‘NR==8,NR==12‘ 

同上例,这也是个范围匹配。

输出第52行

awk ‘NR==52‘ 

如果想要少执行些不必要的循环,就这样写:

awk ‘NR==52 {print;exit}‘ 

输出两次正则表达式匹配之间的行

awk ‘/regex1/, /regex2/‘ 

删除所有的空行

awk NF 

NF为真即是非空行。另外一种写法是用正则表达式:

awk ‘/./‘ 

这个很类似grep .的思路,但是是不如awk NF好的,因为“.”也是可以匹配空格和TAB的。

时间: 2024-12-25 02:53:47

详解著名的awk Oneliner,第三部分:选择性输出特定行的相关文章

linux cat命令使用方法详解--把档案串连接后传到基本输出

linux cat命令使用方法详解--把档案串连接后传到基本输出 日期:2011-12-05 点击:2324 来源: 未知 分享至: 使用方式:cat [-AbeEnstTuv] [--help] [--version] fileName说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案)参数:-n 或 --number 由 1 开始对所有输出的行数编号-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号-s 或 --squeeze-b

Android-多线程断点下载详解及源码下载(三)

本项目完成的功能类似与迅雷等下载工具所实现的功能--实现多线程断点下载. 主要设计的技术有: 1.android中主线程与非主线程通信机制. 2.多线程的编程和管理. 3.android网络编程 4.自己设计实现设计模式-监听器模式 5.Activity.Service.数据库编程 6.android文件系统 7.缓存 博文链接: Android-多线程断点下载详解及源码下载(一) Android-多线程断点下载详解及源码下载(二) Android-多线程断点下载详解及源码下载(四) 本篇接着上

实例详解Spring的事务传播机制(三)

最后这篇文章我们来讨论开发中最常用的剩下三种事务传播机制:REQUIRED.REQUIRES_NEW和NESTED 5. REQUIRED REQUIRED是我们最常用的传播机制.如果当前有存在的事务则加入该事务,如果没有则新开一个事务. 先修改配置文件: <tx:attributes>       <tx:method name="insertSuperTable" propagation="REQUIRED"/>      <tx:

Zookeeper详解-工作流和leader选举(三)

一.工作流 一旦ZooKeeper集合启动,它将等待客户端连接.客户端将连接到ZooKeeper集合中的一个节点.它可以是leader或follower节点.一旦客户端被连接,节点将向特定客户端分配会话ID并向该客户端发送确认.如果客户端没有收到确认,它将尝试连接ZooKeeper集合中的另一个节点. 一旦连接到节点,客户端将以有规律的间隔向节点发送心跳,以确保连接不会丢失. 如果客户端想要读取特定的znode,它将会向具有znode路径的节点发送读取请求,并且节点通过从其自己的数据库获取来返回

详解Linux搭建vsftp服务器通过三种方式实现文件传输

概述 FTP(File Transfer Protocol)中文称为"文件传输协议".用于Internet上的控制文件的双向传输. 工作原理 一.主动模式: 1.客户端通过用户名和密码登录服务器端,登录的是21端口(服务器端主动开启的).2.服务器端通过21端口接收到客户端的访问,验证用户名和密码.3. 登陆成功,客户端会随机开启一个1024以上的端口,在端口上会传递一个叫port的命令,通过命令告知服务器,打开端口,向客户端传递数据.(顺便的会将随机端口号告知服务器)4.服务器接收之

详解FTP服务之vsftpd(附三种用户安装脚本)

FTP(File Transfer Protocol,文件传输协议)可以在网络中传输文档.图像.视频以及应用程序等多种类型的文件.在企业中大多数情况下,则是用户使用FTP从服务器上下载文件.一个完整的FTP文件传输需要建立两种类型的连接,一种为控制文件传输的命令,称为控制连接:另一种实现真正的文件传输,称为数据连接控制连接:客户端希望与FTP服务器建立上传下载的数据传输时,它首先向服务器TCP协议的21端口发起一个建立连接的请求,FTP服务器接受来自客户端的请求,完成连接的建立过程,这样的连接就

《TCP/IP详解 卷一》读书笔记-----第三章 IP

1.Network byte order:数据在网络中的传输是按照大端模式来的,即如果需要传递一个四个字节的int变量,先传递最高的字节,然后依次类推.因此无论主机存储数据用的是大端模式还是小端模式,在传输之前都必须将其转换为大端. 2.IP数据报报头的检验和字段只对报头进行检验.因为通常IP数据报的数据字段中包含的TCP,UDP,ICMP,IGMP数据头部都包含对自身每个比特的校验,所以并不需要在IP数据报报头中进行重复校验. 3.IP路由:当IP层收到一个数据报之后,首先1)检验目的IP地址

读书笔记-tcp/ip详解卷一:协议(第三章)

3.3 IP路由选择 之前一直没有深思为什么局域网是使用MAC地址进行通信,IP用在何处,网络通信经过若干路由转发,如何维持稳定的双向传输. 现在就我个人理解,IP地址仅仅是指导数据包前进的方向,数据包实际的传输靠的可能是MAC地址,至少局域网,网络环境不复杂的情况下应该是,至于各种网络设备通信协议的转换还要继续学习. 数据包在传送开始之前先通过IP找到路由下一跳,将下一跳的设备的MAC地址写入数据包中. 数据包在到达某一设备的时候,如果目的IP和设备IP符合,则交由上层协议处理:若不符合,在设

ROS入门之基础功能详解--编写消息和服务(三)

前言:理解Topic,Message和Service. 话题(Topic):话题相当于QQ群,作用是给所有订阅该话题的节点提供一个“聊天平台”. 消息(Message):消息相当于发布在QQ群内的推送文章,作用是发布者将消息发布到“聊天平台”. 服务(Service):服务相当于私聊,作用是给两个需要直接私聊的成员提供“聊天平台”. 原文地址:https://www.cnblogs.com/chendeqiang/p/10201438.html