免费注册 查看新帖 |

Chinaunix

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

shell怎样实现类似路由器的|begin pattern的功能? [复制链接]

论坛徽章:
0
发表于 2009-06-02 13:08 |显示全部楼层
我写了一个脚本:
#!/usr/bin/ksh

if [ $# != 2 ]; then
  echo "Usage: grepb <pattern> <filename>" >&2
  exit 1
fi

pattern=$1
filename=$2

linenum=`/usr/bin/grep -n $pattern $filename | /usr/bin/sed -n '1p' | /usr/bin/cut -d':' -f1`

if [ -z $linenum ]; then
  exit 1
fi

/usr/bin/sed -n "$linenum,$"p $filename
但是这个脚本如果处理一个100M的文本,必须全文搜索完后才能输出结果,请问怎样能够实现象普通grep那样在处理巨大文本时即时输出结果?

论坛徽章:
0
发表于 2009-06-02 13:16 |显示全部楼层
貌似一句awk可以解决:

  1. awk '/pattern/{T=1}T' URFILE
复制代码

论坛徽章:
0
发表于 2009-06-02 13:31 |显示全部楼层
不行哦老兄。你那个{T=1}T是什么意思?

论坛徽章:
0
发表于 2009-06-02 13:37 |显示全部楼层
原帖由 2bedodo 于 2009-6-2 13:31 发表
不行哦老兄。你那个{T=1}T是什么意思?

不行??把你的测试用例和环境说一下吧~
T是随便设的一个flag,匹配到/pattern/时,把flag设为1,'1'等同于'{print $0}'。
awk '/pattern/{T=1}T' URFILE就是说,匹配到/pattern/后,flag成为1,于是开始输出。

我刚在自己机器上测试了一下,没问题。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
发表于 2009-06-02 13:37 |显示全部楼层
pattern=$1
filename=$2

/usr/bin/sed -n "/$pattern/,$"p $filename
/usr/bin/awk "/$pattern/,0" $filename

论坛徽章:
0
发表于 2009-06-02 13:41 |显示全部楼层
原帖由 ly5066113 于 2009-6-2 13:37 发表
pattern=$1
filename=$2

/usr/bin/sed -n "/$pattern/,$"p $filename
/usr/bin/awk "/$pattern/,0" $filename

原来我也纠结了…… - -

论坛徽章:
0
发表于 2009-06-02 14:02 |显示全部楼层
原帖由 kwokcn 于 2009-6-2 13:37 发表

不行??把你的测试用例和环境说一下吧~
T是随便设的一个flag,匹配到/pattern/时,把flag设为1,'1'等同于'{print $0}'。
awk '/pattern/{T=1}T' URFILE就是说,匹配到/pattern/后,flag成为1,于是开始输 ...


solaris5.9
/usr/bin/awk '/test/{T=1}T' test
awk: syntax error near line 1
awk: bailing out near line 1

more test
jfdksla
fjdsklafjsda
fjsdklafjsa
fjsakfhsa
hfjkasfhkl;sa
test1
fjkdsafjklds;a
fhksdfla;fjksa
fasklf
test2
fdjklsa
fjdkslafds
ahfklsdaf
test3
fjdklsa;fjd;stest

论坛徽章:
0
发表于 2009-06-02 14:32 |显示全部楼层
原帖由 ly5066113 于 2009-6-2 13:37 发表
pattern=$1
filename=$2

/usr/bin/sed -n "/$pattern/,$"p $filename
/usr/bin/awk "/$pattern/,0" $filename


看了半天,好像就是这个意思
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP