如何用awk抽取固定样式字串

sh/bash/dash/ksh/zsh等Shell脚本
philexm
帖子: 1
注册时间: 2012-04-13 22:56

如何用awk抽取固定样式字串

#1

帖子 philexm » 2012-04-13 23:20

如何用awk能从一个文本文件抽取出如下固定样式字串 “/NUM 123 456/”, 后面六位数字是可变的,
如果我直接用 awk '/NUM/' filename 会找出2行,因为其他地方也有NUM这个关键字。需求是只能找到这种样式(带空格)/NUM 123 456/, 并抽取出后面6位数字待用。

请大家帮我出处注意,什么awk script最好解决问题。

谢谢了

文件例子,

---S&E
1 XXXXX TAFI SPECIAL PIC/LPIC/PCA USOC
/PIC 0377/PCA BO
/LPIC 0377
1 1F4CL
/TN 706 964-5301/ZBDI P3225037495/NUM 423 496/INVU /LPCA BO, 03-19-12/LRN 4234960000/NMC /PKG COS-WW-PAMA8/TTRA 706 492/ZSER F8099999A0/SED 03-29-12
1 BSLYG
/TN 706 964-5301/ZBDI P3225037495/ZPRL X129GFGE/ZSER 23099999A6/SED 03-29-12
1 BSL5O
/TN 706 964-5301/ZBDI P3225037495/ZPRL X129GFGE/ZSER 1C099999A5/SED 03-29-12
1 BUNAH
/TN 706 964-5301/ZBDI P3225037495/NUM1AZ2A/ZSER 00099999A1/SED 03-29-12
1 ESC
/TN 706 964-5301/ZBDI P3225037495/PKG COS-WW-PAMA8/ZSER 2A099999A7/SED 03-29-1
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 如何用awk抽取固定样式字串

#2

帖子 lilydjwg » 2012-04-13 23:47

非要 Awk?grep 不行?
头像
b33e
帖子: 3874
注册时间: 2011-06-07 14:20

Re: 如何用awk抽取固定样式字串

#3

帖子 b33e » 2012-04-17 14:24

NUM后面加个空格,它就只有一行了呗,因为你两行NUM的形式不一样,一行后面有空格一行没有。

代码: 全选

awk -F "/" '/NUM /{print $4}' filename
出来结果就是

代码: 全选

NUM 423 496
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 如何用awk抽取固定样式字串

#4

帖子 cao627 » 2012-04-17 15:40

如果文件结构完全陌生,或无规律,不知道NUM6个数在那个字段的话。

代码: 全选

grep 'NUM [0-9][0-9][0-9] [0-9][0-9][0-9]' thefile | sed 's/.*NUM \([0-9][0-9][0-9] [0-9][0-9][0-9]\).*/\1/' 
用grep提取符合条件(包含NUM空格3个数空格3个数)的行,再用sed命令提取需要的6个数字

thefile是放楼主想要处理的文本的文件名
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 如何用awk抽取固定样式字串

#5

帖子 eexpress » 2012-04-17 15:51

ls不知道grep -o的。也不知道正则的多个匹配的嘛。


这事情只是正则的事情。
● 鸣学
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 如何用awk抽取固定样式字串

#6

帖子 cao627 » 2012-04-17 16:12

ls不知道grep -o的
:em11 学习

但楼主如果只想要NUM后的6个数,还要sed一下吧?
也不知道正则的多个匹配的嘛
是指的[0-9][0-9][0-9的简写吗,忘记怎么写了。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 如何用awk抽取固定样式字串

#7

帖子 aerofox » 2012-04-17 17:47

cao627 写了:
ls不知道grep -o的
:em11 学习

但楼主如果只想要NUM后的6个数,还要sed一下吧?
也不知道正则的多个匹配的嘛
是指的[0-9][0-9][0-9的简写吗,忘记怎么写了。
无论如何,用 grep 管道到 sed 都不是个好注意,sed 就可以完成 grep 的功能。
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 如何用awk抽取固定样式字串

#8

帖子 cao627 » 2012-04-17 17:58

无论如何,用 grep 管道到 sed 都不是个好注意,sed 就可以完成 grep 的功能。



我对各命令的详细选项掌握的不周。只知道基本概念,然后就按思路将他们凑成需要的组合。

楼主的需求:是匹配 NUM [0-9]{3} [0-9]{3} ,然后提取NUM 后的六个数,怎么简单实现呢?
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 如何用awk抽取固定样式字串

#9

帖子 lilydjwg » 2012-04-17 18:08

cao627 写了:
楼主的需求:是匹配 NUM [0-9]{3} [0-9]{3} ,然后提取NUM 后的六个数,怎么简单实现呢?

代码: 全选

grep -oP '(?<=NUM )\d{3} \d{3}'
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 如何用awk抽取固定样式字串

#10

帖子 cao627 » 2012-04-17 18:31

代码: 全选

grep -oP '(?<=NUM )\d{3} \d{3}'
:em11
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 如何用awk抽取固定样式字串

#11

帖子 aerofox » 2012-04-17 18:46

cao627 写了:
无论如何,用 grep 管道到 sed 都不是个好注意,sed 就可以完成 grep 的功能。



我对各命令的详细选项掌握的不周。只知道基本概念,然后就按思路将他们凑成需要的组合。

楼主的需求:是匹配 NUM [0-9]{3} [0-9]{3} ,然后提取NUM 后的六个数,怎么简单实现呢?
lilydjwg 给的 grep 是最完美的解决方案。用 sed 的办法,只要在你的例子中稍微改一下就可以了。

代码: 全选

sed -n 's/.*NUM \([0-9][0-9][0-9] [0-9][0-9][0-9]\).*/\1/p' thefile
头像
b33e
帖子: 3874
注册时间: 2011-06-07 14:20

Re: 如何用awk抽取固定样式字串

#12

帖子 b33e » 2012-04-17 19:03

这些东西好灵活的,学习了。
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 如何用awk抽取固定样式字串

#13

帖子 cao627 » 2012-04-17 19:28

-P, --perl-regexp
Interpret PATTERN as a Perl regular expression.

代码: 全选

(?<=NUM )\d{3} \d{3}\d{3} \d{3}
怪不得看不懂,不想深入了
但还是好奇(?<=NUM )?
谁能解释解释吗

表达式本身,能将自己匹配到的内容,做进一步截取?这只是Perl regular expression的特性吗?
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 如何用awk抽取固定样式字串

#14

帖子 lilydjwg » 2012-04-17 19:44

cao627 写了:-P, --perl-regexp
Interpret PATTERN as a Perl regular expression.

代码: 全选

(?<=NUM )\d{3} \d{3}\d{3} \d{3}
怪不得看不懂,不想深入了
但还是好奇(?<=NUM )?
谁能解释解释吗

表达式本身,能将自己匹配到的内容,做进一步截取?这只是Perl regular expression的特性吗?
http://deerchao.net/tutorials/regex/reg ... lookaround
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 如何用awk抽取固定样式字串

#15

帖子 eexpress » 2012-04-17 20:05

● man perlre
学标准的正则。
里面有前后环视。
不需要上网。lol
● 鸣学
回复