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

2017-3-30 / 0 评论 Kali&Linux / Mrxn

本文共计 3047 字,感谢您的耐心浏览与评论.

先来案例一波:

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的功能。

假设我们有一段需要处理的文本内容如下所示(数量几万行,手工别说了,先使用替换命令将|替换成空格):

[email protected]:cory0212
[email protected]:morris409
[email protected]:marigold
[email protected]:jeffrey2
[email protected]:123q123q | 
[email protected]:dinosaur52197 | 
[email protected]:goblue20 | 
[email protected]:Recon1234 | 
[email protected]:32gunz32 | Premium
[email protected]:happily1 | 
[email protected]:susana123 | 
[email protected]:silvia231106 | Standard
[email protected]:hockey30 | 
[email protected]:KtnM990175 | Basic
[email protected]: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.txt



注:说明一下,使用 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 -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,awk,sort三个命令的分隔符选项: http://blog.csdn.net/u011341352/article/details/52910749
  • 多空格&多制表符文本之cut域分割终极方案 : https://sanwen8.cn/p/267AXa4.html
  • linux之cut用法: http://www.cnblogs.com/dong008259/archive/2011/12/09/2282679.html
  • shell脚本抽取文本文件中指定字符串的方法:sed+grep方法、awk+grep方法(必要时可以联合sed以及grep)、grep+cut方法: http://blog.csdn.net/menlinshuangxi/article/details/7979504
  • linux grep命令详解: http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856896.html
  • 使用 grep 的 -o 和 -E 选项进行正则的精确匹配: http://blog.sina.com.cn/s/blog_7e9efc570101adbv.html


标签: 分享 Linux grep cut awk sed

转载:转载请注明原文链接 - 利用grep,cut,awk处理一些文本的简记


0条回应:“利用grep,cut,awk处理一些文本的简记”


发表评论

{view_code_no}