LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 972|回复: 13

grep 以及sed的问题,请赐教

[复制链接]
发表于 2006-5-26 00:39:27 | 显示全部楼层 |阅读模式
假设我有这样的日志
1. abcdefadfafff
2. 1abelad
3. 23413
4. 3120981-34
5. adfasdf
6. 121abeqwer
7. 21342134
8. afsadfaseqerqwr

我需要把某行中有字符串1ab的上一行内容取出来应该怎么用sed或者grep啊
按上文的日志我我应该取第1行和第5行,其他不要,这应该怎么写啊,请赐教
发表于 2006-5-26 00:50:34 | 显示全部楼层
我看错题目了。。sorry。。
回复 支持 反对

使用道具 举报

发表于 2006-5-26 03:21:43 | 显示全部楼层
awk 'BEGIN{line=""}{if($2~/1ab/){print line};line=$0}' test.txt

Using sed is too complicated.
回复 支持 反对

使用道具 举报

发表于 2006-5-26 09:15:25 | 显示全部楼层
sed -n -e '/1ab/p' test.txt
回复 支持 反对

使用道具 举报

发表于 2006-5-26 23:06:15 | 显示全部楼层
sed -f sed.previous test.txt

其中sed.previous文件的内容为:
:next
/1ab/{
       g
       p
       b next
}
{
       h
       d
}

或者

/1ab/{
       g
       p
}
/1ab/!{
       h
       d
}

Or

/1ab/{
x
p
}
/1ab/!{
h
d
}

另外,以上楼主,请提交回答前自己先试一试,不要灌水。谢谢!
回复 支持 反对

使用道具 举报

发表于 2006-5-26 23:29:30 | 显示全部楼层
$ grep -P ".*(?=\n.*1ab*)" MyLog.txt
1. abcdefadfafff
5. adfasdf
回复 支持 反对

使用道具 举报

发表于 2006-5-27 10:08:42 | 显示全部楼层
".*(?=\n.*1ab*)"

楼主,能解释一下你的这个RE吗?谢谢。特别是这个括号的作用。
回复 支持 反对

使用道具 举报

发表于 2006-5-27 10:29:08 | 显示全部楼层
[QUOTE=][/QUOTE]
Perl regexp 可移植性不高。

我的grep不支持。

http://savannah.gnu.org/bugs/?func=detailitem&item_id=14990
回复 支持 反对

使用道具 举报

发表于 2006-5-27 10:51:07 | 显示全部楼层
awk '/1ab/ {print line}{line=$0}' test
回复 支持 反对

使用道具 举报

发表于 2006-5-27 11:08:58 | 显示全部楼层
叠床架屋式:

grep -n 1ab test.txt | cut -d: -f1 | while read line; do sed -n $((line-1))p test.txt; done

这些办法都存在一个小问题,第一行就匹配1ab该怎么办。
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表