【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)

linux 有很多工具可以做文本处理,例如:sort, cut, split, join, paste, comm, uniq, column, rev, tac, tr, nl, pr, head, tail.....,学习 linux 文本处理的懒惰方式(不是最好的方法)可能是:只学习grep,sed和awk。 使用这三个工具,你可以解决近 99% linux 系统的文本处理问题,而不需要记住上面不同的命令和参数。:)

而且,如果你已经学会并使用了三者,你就会知道其中的差异。实际上,这里的差异意味着哪个工具擅长解决什么样的问题。

一种更懒惰的方式可能是学习脚本语言(python,perl或ruby)并使用它进行每个文本处理。

awk、grep、sed 是 linux 操作文本的三大利器,也是必须掌握的 linux 命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属 awk 功能最强大,但也最复杂。grep 更适合单纯地查找或匹配文本,sed 更适合编辑匹配到的文本,awk 更适合格式化文本,对文本进行较复杂格式处理。

http://t.csdn.cn/ItfEM

目录

  1. 正则表达式
  2. 三剑客——awk(老大)、sed(老二)、grep(老三)​​​​​​​
  3. 三剑客老三:grep​​​​​​​
    1. grep 常用参数​​​​​​​
  4. 三剑客老二:sed
    1. sed p查找打印——print 
    2. sed d删除——delete
    3. sed  cai增加——replace、append、insert   
    4. sed s 替换——substitute
  5. 三剑客老大:awk
    1. awk取行
    2. awk取列
    3. awk 模式匹配
    4. awk数组
    5. awk循环与判断​​​​​​​

总结:

一、正则表达式

上手三剑客(grep,sed,awk)之前,需要熟悉正则表达式,正则表达式——事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。而正则表达式又分普通正则和扩展正则。

1.普通正则

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第1张图片

grep   ' ^s '   filename.txt    # 匹配以s开头

grep   ' a$ '   filename.txt    # 匹配以a结尾

grep   ' ^$ '   filename.txt     # 匹配出空行

grep  -n   ' . '   filename.txt       # . 匹配出所有(空行除外)

grep  -n   ' a* '   filename.txt       # * 匹配前一个字符(a)连续出现0次或者多次

grep  -n   ' .* '   filename.txt       #  .* 表示所有(包括空行)

# # 一次匹配一个字符,可多样。[abcd],匹配a或者b或者c或者d,注意:匹配的scala和hbase中有ca、ba两个同时出现,要看具体匹配过程可加-o参数

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第2张图片

# # 取反[^abc],即为排除abc(不高亮abc)

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第3张图片

 # 中括号区间匹配 [a-z],其中++不在小写a至z之间,所以没有高亮

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第4张图片

# # \反斜杠转义,第一个grep由于没有转义,匹配出任意的字符,所以所有字符都高亮显示了,而第二grep加了转义符"\"反斜杠,将.转义成普通的字符,所以高亮显示了awk.sed.grep

2.扩展正则

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第5张图片

特别说明:由于是用到了扩展正则,所以grep需要加参数 -E,你可能也见过egrep,egrep 和grep -E 完全一样,只是扩展的另一种写法

egrep  ' text+ '  filename.txt             # # 扩展正则+号,前一个字符(text)出现1次或者1次以上,也就是至少匹配1次

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第6张图片

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第7张图片

egrep  ' l|k '  filename.txt             # # 扩展正则|符号,匹配l或者k  l|k

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第8张图片

egrep  ' s(c|p)a '  filename.txt             # # 扩展正则() ,匹配sa中间是c或者p的 

# # 扩展正则 {} 次数匹配 

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第9张图片

egrep  ' l? '  filename.txt             # # 扩展正则 ? 匹配?前的字符(l)连续出现0次或者1次,其中小写l在后面的字母hello出现了1次,scala出现0次,golang也是0次。 

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第10张图片

二、三剑客

Linux 的三剑客指的是 awk、sed 和 grep。

awk 是一种用来处理文本文件的工具,它可以根据指定的模式进行自动分割并进行数据处理。

sed 是一种流编辑器,它可以对文本文件进行替换、删除和插入操作。

grep 是一种文本搜索工具,它可以在文本文件中搜索指定的字符串。

简单概括:

  • grep:数据查找定位
  • awk:数据切片
  • sed:数据修改
名字 适用场景
awk 用于过滤,取列,统计计算。取对应列的值,后续用于对比、计算,以及数组的计算,由于数组计算使得awk排行老大
sed 用于过滤,查找行(行号、范围),增删改查。文件的修改以及日志的范围取行,如晚上0点到凌晨1点的日志
grep 用于过滤,grep的命令过滤是最快的

具体见http://t.csdn.cn/8pdVl​​​​​​​

1. grep

grep命令用于查找文件里符合条件的字符串

grep "text" filename.txt

grep 将遍历文件 “filename.txt” 的每一行,并打印出其中  包含单词“text”   的每一行

grep -n 将遍历文件 “filename.txt” 的每一行,并打印出其中  包含单词“text”   的每一行及其行号

grep -v 将遍历文件 “filename.txt” 的每一行,并打印出其中  不包含单词“text”   的每一行及其行号

grep -c 将遍历文件 “filename.txt” 的每一行,并打印出其中  包含单词“text”   的行数

grep -i 忽略大小写,将遍历文件 “filename.txt” 的每一行,并打印出其中  包含单词“text”   的每一行

grep -x 选项只精确匹配,将遍历文件 “filename.txt” 的每一行,并打印出其中 该行只有单词“text”   的每一行

grep -A 将遍历文件 “filename.txt” 的每一行,并打印出其中  包含单词“text”   的每一行及其上下行

2. sed

3. awk

awk是一种用于处理文本的编程语言工具,很多方面都类似于shell(c语言),主要应用场景:统计日志,计算。其awk执行过程如下图。左边为案例,右边为流程图

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第11张图片

 在上手awk之前首先了解什么是行与列,行——awk中称为记录,单行默认以回车分割;列——awk中称为字段(类似于数据库的字段),默认用空格分割。除了行与列还需要熟悉awk的常用内置变量,以下的内置变量在接下来的案例中都有使用到 

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第12张图片

  •  awk取行

行号的内置变量是NR,运算符有>  <  >=  <=  ==  !=

 awk  ' NR==1 '  filename.txt        #NR==1:取第一行

 awk  ' NR>=3 && NR<=6 '  filename.txt        #NR>=3 && NR<=6:取3到6行(范围取行)

 awk  ' /spark/ '  filename.txt        #/spark/:精确匹配取spark行

 awk  ' /java/,/spark/ '  filename.txt        #/java/,/spark/:也可以匹配范围取行,比如java到spark的所有行

  •  awk取列

参数说明:

        -F : 指定分隔符——每一列的结束符,默认为空格、连续空格、制表符

        $数字:awk中$数字就表示第几列,$0表示处理后输出的所有

awk  ' {print  $1} '   filename.txt        #awk取第一列

ll  |   awk  ' {print  $1,$NF} '   filename.txt        #取ll 显示的第1列和最后一列($NF)

head  -3  /etc/shadow  |   awk  -v  FS=' : '    -v  OFS=' --- '  ' {print  $5,$1} '   filename.txt        #取/etc/shadow前3行的第1列和第五例,并置换位置,且输出分隔符用  ---

head  -3  /etc/shadow  |   awk  -F' : '    -v  OFS=' --- '  ' {print  $5,$1} '   filename.txt       #取/etc/shadow前3行的第1列和第五例,并置换位置,且输出分隔符用  ---

取出 /etc/passwd 第三行至第七行,并且置换第一列与第最后一列,屏幕输出列的分割符号用%

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第13张图片

  • awk模式匹配

awk -F'[ /]+' 'NR==3{print $3}' 

        awk——命令

        -F ——选项

        'NR==3{print $3}'——模式{动作}          # 此处下面为模式说明

                模式说明——

                        比较符:> < >= <= == !=

                        正则://,斜线里支持写扩展正则,能精确到单列,包含(~)和不包含(!~)

                        范围表达式:/开始/,/结束/;NR==2,NR==7     # 前者为方式一,后者为方式二

  

awk  ' NR>1 { print $NF} '  filename.txt        #从第二行开始取最后一列

awk  ' $2  ~ / ^2/ '  filename.txt        #取第二列以2开头

awk    -F" "  -v   OFS=" *** " ' $NF  ~ / [abc]$ /  {print $1,$NF} '    filename.txt        #找最后一列,以a,b,c结尾的,并显示第1列和最后一列,以***分割输出

tail -n message       #看日期和时间在message文件的1、2、3列               awk  ‘  / 18:50:01 /, / 18:50:01 /  {print $1,$2,$3}  ’       #显示message 18:50:01到19:10:01 月份日期和时间

  • awk数组

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第14张图片

awk -F" " '{array[$2]++}   END{for (i in array) print array[i],i}' file.txt |sort -rn            #统计file.txt中每个单词出现的,并按降序排列

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第15张图片

awk   -F" "  '$2  ~  / ^[r-z] /   {array[$2]++}    END{for (i in array)   print array[i],i} '   file.txt  | sort -rn            #统计file.txt中第二列首字母在r-z范围内,每个单词出现的次数,并按降序排列

  • awk循环与判断

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第16张图片

 awk for循环案例:

awk判断案例:输出磁盘使用率小于30%的所有信息

【生信Linux基础】Linux文本处理三剑客(awk、grep、sed)_第17张图片

awk循环与判断进阶案例:echo "Life there are always frustrations, as long as we meet chaoyang, will see the light ahead.",输出语句中每个单词的字母数量大于等于5的单词

你可能感兴趣的:(生信Linux基础,linux,运维,服务器)