+ -
当前位置:首页 → 问答吧 → 请教高手:shell或sed相关问题——谢谢!!!

请教高手:shell或sed相关问题——谢谢!!!

时间:2011-07-03

来源:互联网

文本中的内容如下:
/dataSourceSyncNotify****
****
****
ID=0123456****
****
uri=/dataSourceSyncNotify

/dataSourceSyncNotify
****
****
****
ID=0123457
****
uri=/dataSourceSyncNotify


我用grep -n "0123456" myfile得到标红(在文本里唯一)所在的行号,比如为5. 然后我如何根据这个行号得到它前后离它最近的即标绿的(在文本里不唯一)两行的行号呢?

谢谢!

作者: wxdlut   发布时间: 2011-07-03

回复 wxdlut

是这个意思吗?
  1. echo '/dataSourceSyncNotify****
  2. ****
  3. ****
  4. ID=0123456****
  5. ****
  6. uri=/dataSourceSyncNotify

  7. /dataSourceSyncNotify
  8. ****
  9. ****
  10. ****
  11. ID=0123457
  12. ****
  13. uri=/dataSourceSyncNotify' |awk -v num='0123456' '/^\/dataSourceSyncNotify/{x=0;y=0}{x++}x>0&&$0~num{printf (NR-x+1)" ";y=1}y==1&&x>0&&/^uri=\/dataSourceSyncNotify/{print NR;x=0}'
  14. 1 6
复制代码

作者: yinyuemi   发布时间: 2011-07-03

回复 yinyuemi


    恩 差不多的 如果那些文本是存在一个文件里面,在myfile里面:
>cat myfile
/dataSourceSyncNotify
****
****
****
ID=0123456
****
****
uri=/dataSourceSyncNotify

/dataSourceSyncNotify
****
****
****
ID=0123457
****
uri=/dataSourceSyncNotify

我就想写个脚本,通过ID=0123456得到标绿的行号。请问一下,你的方法该如何变动一下实现这个呢?

我的做法比较笨:先通过 grep -n "0123456" > tmp.txt
                                   读取tmp.txt,得到行号
然后,根据这个行号往前往后扫描找到标绿的行号(就是这里不知道怎么做?)

非常感谢!

作者: wxdlut   发布时间: 2011-07-03



QUOTE:
回复  wxdlut

是这个意思吗?
yinyuemi 发表于 2011-07-03 13:29




    不好意思啊,我描述的不太清楚。

上述文本存在文件中,我想写一个脚本,根据ID=0123456得到前后标绿的两行(靠的最近)的行号

作者: wxdlut   发布时间: 2011-07-03

回复 wxdlut


    awk -v num='0123456' '/^\/dataSourceSyncNotify/{x=0;y=0}{x++}x>0&&$0~num{printf (NR-x+1)" ";y=1}y==1&&x>0&&/^uri=\/dataSourceSyncNotify/{print NR;x=0}' urfile

红色的部分是变量的设计部分,我以0123456为变量为例的:num是变量名,0123456是变量值

作者: yinyuemi   发布时间: 2011-07-03