分页: 1 / 2
如何用awk抽取固定样式字串
发表于 : 2012-04-13 23:20
由 philexm
如何用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
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-13 23:47
由 lilydjwg
非要 Awk?grep 不行?
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 14:24
由 b33e
NUM后面加个空格,它就只有一行了呗,因为你两行NUM的形式不一样,一行后面有空格一行没有。
代码: 全选
awk -F "/" '/NUM /{print $4}' filename
出来结果就是
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 15:40
由 cao627
如果文件结构完全陌生,或无规律,不知道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是放楼主想要处理的文本的文件名
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 15:51
由 eexpress
ls不知道grep -o的。也不知道正则的多个匹配的嘛。
这事情只是正则的事情。
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 16:12
由 cao627
ls不知道grep -o的

学习
但楼主如果只想要NUM后的6个数,还要sed一下吧?
也不知道正则的多个匹配的嘛
是指的[0-9][0-9][0-9的简写吗,忘记怎么写了。
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 17:47
由 aerofox
cao627 写了:ls不知道grep -o的

学习
但楼主如果只想要NUM后的6个数,还要sed一下吧?
也不知道正则的多个匹配的嘛
是指的[0-9][0-9][0-9的简写吗,忘记怎么写了。
无论如何,用 grep 管道到 sed 都不是个好注意,sed 就可以完成 grep 的功能。
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 17:58
由 cao627
无论如何,用 grep 管道到 sed 都不是个好注意,sed 就可以完成 grep 的功能。
恩
我对各命令的详细选项掌握的不周。只知道基本概念,然后就按思路将他们凑成需要的组合。
楼主的需求:是匹配 NUM [0-9]{3} [0-9]{3} ,然后提取NUM 后的六个数,怎么简单实现呢?
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 18:08
由 lilydjwg
cao627 写了:
楼主的需求:是匹配 NUM [0-9]{3} [0-9]{3} ,然后提取NUM 后的六个数,怎么简单实现呢?
代码: 全选
grep -oP '(?<=NUM )\d{3} \d{3}'
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 18:31
由 cao627
代码: 全选
grep -oP '(?<=NUM )\d{3} \d{3}'

Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 18:46
由 aerofox
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
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 19:03
由 b33e
这些东西好灵活的,学习了。
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 19:28
由 cao627
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression.
代码: 全选
(?<=NUM )\d{3} \d{3}\d{3} \d{3}
怪不得看不懂,不想深入了
但还是好奇(?<=NUM )?
谁能解释解释吗
表达式本身,能将自己匹配到的内容,做进一步截取?这只是Perl regular expression的特性吗?
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 19:44
由 lilydjwg
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
Re: 如何用awk抽取固定样式字串
发表于 : 2012-04-17 20:05
由 eexpress
● man perlre
学标准的正则。
里面有前后环视。
不需要上网。lol