LinuxSir.cn,穿越时空的Linuxsir!

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

用awk怎样提取[]里的数据

[复制链接]
发表于 2007-8-9 14:11:01 | 显示全部楼层 |阅读模式
这个问题困扰了我好久,有这样一行文字
fsdfsdf number:[13342632518] alallelaefdsfs errorcode:[40010] fasefsdfsdafsdv

有什么方法可以提取[]里的内容,然后输出
13342632518 40010

是不是用awk能够实现,或者别的命令也可以?请教各位大虾帮帮忙吧
发表于 2007-8-9 17:12:07 | 显示全部楼层
cat SRCFILE | grep -o "\[[0-9]*\]" | tr -d "[]" | sed 'N;s/\n/ /g'

假设这里的SRCFILE是含有输入行的文件。也许写法不高明但可以完成需要。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-9 17:37:13 | 显示全部楼层
谢谢你的回复,我用你的命令没有看到输出 (我用grep -o显示 参数不存在,改成egrep了)

cat myfile | egrep "\[[0-9]*\]" | tr -d "[]" | sed 'N;s/\n/ /g'

我是菜鸟也没看懂 tr -d "[]" | sed 'N;s/\n/ /g' 的意思。[]里面不一定是数字也会是字符
fsdfsdf number:[13342632518] alallelaefdsfs errorcode:[aa40010abc] fasefsdfsdafsdv
回复 支持 反对

使用道具 举报

发表于 2007-8-9 21:36:45 | 显示全部楼层
改一下:

cat SRCFILE | grep -Eo "\[\w{1,}\]" | tr -d "[]" | sed 'N;s/\n/ /g'

以上面的例子,在这里可以得到正确输出:

13342632518 aa40010abc

grep不接受-o的话,您用的莫非不是Linux而是其它类Unix系统么?改成egrep不行,因为egrep等效于grep -E,但不能代替-o,-o的意义是只显示匹配的那部分字段,或许您可以从man手册中找到其它可代替的选项。

tr -d "[]" | sed 'N;s/\n/ /g',前句用于删除输出中的中括号,后句用于把本来两行的输出合并成一行。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-10 07:23:19 | 显示全部楼层
那是solaris系统,grep没找到类似-o的功能。我把文件传到别的Linux机器去处理就行了。还是linux的shell命令功能强大 谢谢孤坟的帮助
回复 支持 反对

使用道具 举报

发表于 2007-8-13 05:10:33 | 显示全部楼层
用awk的话,可以这样
cat SRCFILE | awk -vRS="["  -vFS="]" 'NR>1 {printf("%s ",$1)};END {printf("\n")}'
在win下,无法测试,楼主自行测试,大致就是这样了
PS:又见千里孤坟...
回复 支持 反对

使用道具 举报

发表于 2007-8-13 14:08:06 | 显示全部楼层
  1. echo string | awk '{print gensub(".*\\[(.*)\\].*\\[(.*)\\].*", "\\1 \\2", "g")}'
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-8-14 13:17:02 | 显示全部楼层
sed的扩展正则也行吧
  1. $ echo 'fsdfsdf number:[13342632518] alallelaefdsfs errorcode:[40010] fasefsdfsdafsdv' | sed -r 's/.*\[(.*?)\].*\[(.*?)\].*/\1 \2/'
  2. 13342632518 40010
  3. $ echo 'fsdfsdf number:[13342632518] alallelaefdsfs errorcode:[40010] fasefsdfsdafsdv' | perl -lpe 's/.*\[(.*?)\].*\[(.*?)\].*/$1 $2/'
  4. 13342632518 40010
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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