免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 10057 | 回复: 36
打印 上一主题 下一主题

awk中地址表示的小技巧 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-21 19:09 |只看该作者 |倒序浏览
sed中表示地址或地址范围大家都很熟悉,今天贴几个awk中地址表示的小技巧:
  1. 第一行:        NR==1 或 !i++
  2. 第n行:        NR==n
  3. 最后一行:       0 或 "" 或 1==0 或 1>2 ,总之任一个假值就可以
  4. 匹配正则表达式RE的行: /RE/
复制代码


举例:
  1. $ seq 10 |awk  '!i++,/3/; NR==6, 0'
  2. 1
  3. 2
  4. 3
  5. 6
  6. 7
  7. 8
  8. 9
  9. 10
复制代码


等价的sed命令:
  1. sed -ne '1,/3/p;6,$p'
复制代码

[ 本帖最后由 woodie 于 2006-1-21 19:11 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-01-21 20:18 |只看该作者
学习

论坛徽章:
0
3 [报告]
发表于 2006-01-21 20:45 |只看该作者
!i++

这个怎么解?

论坛徽章:
0
4 [报告]
发表于 2006-01-21 21:22 |只看该作者
最后一行的表示方法不行啊!
!i++也莫名其妙

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2006-01-22 01:31 |只看该作者
也许写成这样,更容易理解
awk 'NR==1,/3/;NR>=6'

论坛徽章:
0
6 [报告]
发表于 2006-01-22 08:42 |只看该作者
不行也不懂!请楼上解释一下!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2006-01-22 11:32 |只看该作者
原帖由 大蚂蚁 于 2006-1-21 20:45 发表
!i++

这个怎么解?


这个条件只在第一行时为真一次,然后永远为假,与NR==1等价。
i的初值为0,0在awk中是假值的一种,取反即为真。当i非0时,i为真,取反即为假。
这个有点变态了,大家忘掉它也罢。^_^

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2006-01-22 11:36 |只看该作者
原帖由 ruifox 于 2006-1-21 21:22 发表
最后一行的表示方法不行啊!
!i++也莫名其妙

你的awk可能版本较老,请换个awk试试。
0是简单的假值表示法。也许空串""在你的环境下能够工作?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2006-01-22 11:42 |只看该作者
原帖由 寂寞烈火 于 2006-1-22 01:31 发表
也许写成这样,更容易理解
awk 'NR==1,/3/;NR>=6'

火兄的这个不错!赞一个。更加简洁,但适用性稍差。
考虑以下这个情况,打印匹配行之后的所有行:
awk '/RE/,0'
此时NR>=linenumber的语法就不行了。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2006-01-22 11:50 |只看该作者
原帖由 woodie 于 2006-1-22 11:42 发表

火兄的这个不错!赞一个。更加简洁,但适用性稍差。
考虑以下这个情况,打印匹配行之后的所有行:
awk '/RE/,0'
此时NR>=linenumber的语法就不行了。

受教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP