利用grep,cut,awk处理一些文本的简记

先来案例一波:

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。 Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
假设我们有一段需要处理的文本内容如下所示(数量几万行,手工别说了,先使用替换命令将|替换成空格):
martin.montrell@gmail.com:cory0212
rakin714@gmail.com:morris409
maytagmandhs@gmail.com:marigold
ffaircloth@gmail.com:jeffrey2
thunderbirdsc5@hotmail.com:123q123q | 
ryantran753@gmail.com:dinosaur52197 | 
cujo915@hotmail.com:goblue20 | 
owenjamesjr@yahoo.com:Recon1234 | 
jrnnm32@yahoo.com:32gunz32 | Premium
trevorbonnett@tiscali.co.uk:happily1 | 
juancombat@outlook.es:susana123 | 
paololoni@virgilio.it:silvia231106 | Standard
gregorybrant@yahoo.com:hockey30 | 
misty_eagles75@yahoo.com:KtnM990175 | Basic
artursberzinskis9@inbox.lv:arturs2000 | 

我们需要从上面这段文本里面提取分离出邮箱和冒号后面竖线|之间的这两部分.如何操作呢?

首先  提取邮箱,我们可以使用grep来配合正则表达式直接提取邮箱,邮箱提取很简单.只需要一条命令:

grep -E -o '([a-zA-Z0-9_\-\.\+]+)*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}' xxx.txt  >> goodmail.tx

注:说明一下,使用 grep 的 -o 和 -E 选项进行正则的精确匹配,其中 -o 表示“only-matching”,即“仅匹配”之意。光用它不够,配合 -E 选项使用扩展正则表达式则威力巨大。哈哈,精准,迅速.快狠准!(命令中的xxx.txt问需要处理的文本,>> 表示追加到后面的 goodmail.txt,如果没有则自动创建此文件,如果需要使用grep)命令多次提取同一类型的字符,请使用单大于符号 > ,表示覆盖.写这些,纯粹是为了小白,我自己就是-_-|)

那么,我们使用cut 来提取邮箱,也很容易的,先来看看cut命令的介绍:

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。

1)其语法格式为:

cut [-bn] [file] cut [-c] [file] cut [-df] [file]

使用说明

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c -f 标志之一。主要参数 -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。

-c :以字符为单位进行分割。

-d :自定义分隔符,默认为制表符。

-f :与-d一起使用,指定显示哪个区域。

-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。1)其语法格式为:cut [-bn] [file] cut [-c] [file] cut [-df] [file]使用说明cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c -f 标志之一。主要参数 -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。-c :以字符为单位进行分割。-d :自定义分隔符,默认为制表符。-f :与-d一起使用,指定显示哪个区域。-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。
在这里,我们只需要一条命令就可以搞定提取邮箱了,直接提取冒号前面的就行,冒号就是界定符。

cut -d ':' -f 1 xxx.txt >> goodmail.txt
那如何提取邮箱后面的字符呢?

cut -d ':' -f 2 xxx.txt >> goodpwd_bad.txt

说明一下,但是没有第二个冒号,那么cut命令发现没有第二个冒号,那么就会使用默认的换行符,即在第一个冒号后的第一个换行符,那么邮箱后面的就取到了.但是因为这个文本并不是标准格式化的,后面还有一些 类似下面的格式 两个单词之间有空格,而我们只需要前面第一个部分.

frdbcgl9676  Standard
archie2002  
beaver92  Premium
bethany7  Standard
webbera1  
thunder00

这就简单了,在次在此基础上进行cut操作即可:

cut -d ' ' -f 1 goodpwd_bad.txt  > goodpwd.txt
#注意,两个单引号之间是个空格,并非就是两个单引号凑一起。

如果用awk来处理,稍稍复杂,这需要你会计算两个字符之间的长度,对于像我这种的不规则的,很不好下手...下面简单的举个例子:

echo abcdefghelloword | awk -v head="ab" -v tail="fg" '{print substr($0, index($0,head)+length(head),index($0,tail)-index($0,head)-length(head))}'
#以上关键是计算出开头标记"ab",和结束标记"fg" 在字符串中的位置
#执行结果就是
#cde

其实这三个命令grep,cut,awk,通常是配合管道|和sed命令联合使用,很强大.这就是为啥linux处理文件速度比windows快!





cut 是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。 1 )其语法格式为: cut [- bn ] [ file ] cut [- c ] [ file ] cut [- df ] [ file ] 使用说明 cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。 如果不指定 File 参数, cut 命令将读取标准输入。必须指定 - b 、- c - f 标志之一。 主要参数 - b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 - n 标志。 - c :以字符为单位进行分割。 - d :自定义分隔符,默认为制表符。 - f :与- d 一起使用,指定显示哪个区域。 - n :取消分割多字节字符。仅和 - b 标志一起使用。如果字符的最后一个字节落在由 - b 标志的 List 参数指示的< br />范围之内,该字符将被写出;否则,该字符将被排除。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值