免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1908 | 回复: 5

求助一条awk正则表达式的实现,谢谢 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-02-02 06:20:00
发表于 2013-03-26 15:38 |显示全部楼层
如下,文本中存在如下信息,目前只需要把每条userid后两行的信息如online打印出来,请教怎么写awk?
userid
123
online
………………
usernumber
567
………………
userid
456
online

对于这个需求,昨天发贴求助,好几位高手给出了命令,测试了一下如下这个是最ok的,但我看了很久没有搞明白这个正则表达式怎么实现我的需求的,短信给提供这个语句的高人还没答复,所以另开一贴盼解答,先谢谢各位高手了.
awk  '/userid/{p=1;n=NR}p && NR-n == 2'  urfile

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2013-03-26 17:27 |显示全部楼层
回复 1# youcaihuazi


    和正则关系不大,和p关系比较大~

awk  '/userid/{p=1;n=NR}{print $0, p, "&&", NR-n == 2}'  urfile

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-02-02 06:20:00
发表于 2013-03-27 08:32 |显示全部楼层
yinyuemi 你好,按照你解析后的命令测试了一下,输出不正确,不明白这里定义这个变量p具体怎么用的.

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-02-02 06:20:00
发表于 2013-03-27 08:37 |显示全部楼层
awk  '/userid/{p=1;n=NR}{if(p&&NR-n == 2) print $0}' urfile

刚才测试了一下,如果修改为如上就可以了,谢谢yinyuemi 帮助.后边{if(p&&NR-n == 2) print $0}'这部分条件清楚了,但还有个问题,前边/userid/{p=1;n=NR}这部分正则表达式怎么用完整的逻辑表达式表现出来呢?

论坛徽章:
0
发表于 2013-03-27 09:15 |显示全部楼层
本帖最后由 Perlvim 于 2013-03-27 09:15 编辑

这个不是正则的威力,是 awk 其他命令的特性。这种代码一般人看不懂:

提供一个 Perl 解决方案:


#!perl

use 5.014;

# 获取数据,保存为数组
my @lines = <DATA>;
# 临时记忆变量,来记住 userid 后过了几行
# 初始化值永远都不可能匹配成功
my $past_lines = 3;
foreach my $line (@lines) {
  # 去掉每行数据后的回车
  chomp $line;
  # 如果匹配到 userid 就将计数器置零
  # 否则,就递增
  $line =~ /userid/ ? $past_lines = 0 : $past_lines++;
  # 过了两行后,就是需要的数据
  say $line if $past_lines == 2;
}

__DATA__
userid
123
online
………………
usernumber
567
………………
userid
456
online

论坛徽章:
0
发表于 2013-03-27 15:50 |显示全部楼层
p是什么用法呢?同疑问,感觉不用这个p也可以阿

{
        if( $0 ~ /userid/){
                n=NR;
        }
        if( NR-2 == n){
                print $0;
        }

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP