Linux三剑客 grep、awk、seed

佐手、 提交于 2020-03-30 19:39:05

简介

grep:适合单纯的查找或匹配文本

sed:适合编辑文本

awk:适合格式化文本,对文本进行复杂的格式化处理

1.grep

  grep -help

  【options】

  -c:只输出匹配行的计数

  -i:不区分大小写

  -h:查询多文件是不显示文件名

  -l:查询多文件时只输出包含匹配字符的文件名

  -m:显示匹配行及行号

  -s:不显示不存在或无匹配文本的错误信息

  -v:显示不包含匹配文本的所有行

  -color=auto:可以将找到的关键词部分加上颜色的显示

  【pattern】正则参数含义

  \:忽略正则表达式中特殊字符的原有含义

  ^:匹配正则表达式的开始

  $:匹配正则表达式的结束

  \<:从匹配正则表达式的行开始

  \>:到正则表达式的行结束

  []:单个字符ex:[a]即a符合

  [-]:范围ex:[a-c],即a,b,c符合

  .:所有单个字符

  *:有字符,长度可以为0

  【简单使用】匹配的是当前文件夹下

  grep ‘test’ d* 显示所有以d开头的文件中包含test的行

  grep ‘test’ aa bb cc 显示在aa,bb,cc文件中匹配test的行

  grep ‘[a-z]\{5\}’ aa 显示在aa文件中所有包含每个字符串至少有连续5个小写字符的字符串的行

  grep 'w\(es\)t.8\1' aa 如果west被匹配,则es存储到内存中,并标记为1,然后搜索任一个字符(.*)这些字符后面紧跟着es(\1),找到就显示该行

  egrep或grep -E 不需要使用'\'进行转义

  【复杂实例】

  grep -r :搜索子目录

  grep -d skip :忽略子目录

2.sed

  利用脚本来处理文本文件

  可依照脚本的指令来处理、编辑文本文件

  主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等

  【参数说明】

  -e<script>或-expression=<script> 以选项中中指定的script来处理输入文本文件 只是在终端显示

  -i<script>或-expression=<script> 以选项中中指定的script来处理输入文本文件 修改源文件

  -f<script文件>或-file=<script文件>以选项中指定的script文件来处理输入的文本文件

  -h或-help 显示帮助

  -n或-quiet或-silent仅显示cript处理后的结果

  -v或-version显示版本信息

  【动作说明】

  a:新增 a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)

  c:取代,c的后面可以接字符串,这些字符串可以取代n1,n2之间的行

  d:删除, d通常后面不接任何内容

  i:插入,i后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)

  p:打印,将某个选择的数据打印,通常与参数sed -n 一起运行

  s:取代,可以直接进行取代的工作,通常这个s的动作可以搭配正则表达式。ex:1,20s/old/new/g

  【实例】

  sed -e 4a\newLine testfile 第四行添加新的字符串

     nl /etc/passwd | sed '2i drink tea'  passwd显示行号输出并在第2行前插入drink tea

  nl /etc/passwd | sed '2,5c No 2-5 number' passwd显示行号输出并将2~5行内容替换成 No 2-5 number

  sed 's/is/are/g' testfile 将is换成are

  sed '1,3d' testfile 删除前三行

  sed ''\%pig%d" testfile 删除包含pig的行

  sed "/^$/d" testfile 删除空白行

  sed -n '5,10p' testfile 显示5~10行

3.awk

  实用用法

  awk是一种处理文本文件的语言,是一个强大的分析工具

  -F fs or --field-separator fs:指定输入文件拆分分隔符 fs是一个字符串或者是一个正则表达式,ex:-F:

  -v var=value or --asgin var=value 赋值一个用户定义变量

  -f scriptfile or --file scriptfile 从脚本文件中读取命令

  -mf nnn and -mr nnn 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目 -mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展,在标准awk中不适用  

  【用法1】

  awk ‘{[pattern] action}’ {filenames} 行号匹配语句 awk只能使用单引号

  【实例】每行按空格或tab分割

  awk '{print $1,$4}' log.txt 输出文本中每行的1,4项

  awk 'length>8' log.txt 文件中找出大于8的行

  【用法2】

  awk -F 相当于内置变量 FS,指定分隔符

  【实例】

  awk -F, 'print{$1,$2} log.txt 使用','分割

  awk -F'[ ,]' '{print $1,$2,$5}' log.txt 使用多个分隔符,先使用空格分割,然后对分割结果在使用‘,’分割

  【用法3】

  awk -v 设置变量

  【实例】

  awk -va=1 ‘{print $1, $1+a}’ log.txt 设置变量a并赋值为1,打印第一列和第一列加变量a的值

  awk -va=1 -vb=2 '{print $1,$1+a,$1b}' 设置两个变量ab并赋值,打印第一列,第一列加a,第一列拼接b

  【用法4】

  awk -f {awk 脚本} {文件名}

  【实例】

  awk -f cal.awk log.txt 动作写入cal.awk中 执行脚本使用

  【运算符】  

  

  【实例】

  #过滤第一列大于2的行

  $ awk '$1>2' log.txt    

  #过滤第一列等于2的行

  $ awk '$1==2 {print $1,$3}' log.txt 

  【内置变量】 

    

  【实例】

    $ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt

    FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS---------------------------------------------

    log.txt    2    1         5    1

    log.txt    2    2         5    2

    log.txt    2    3         3    3

    log.txt    2    4         4    4

    $ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt

    FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS---------------------------------------------

    log.txt    2    1    '    1    1

    log.txt    2    2    '    1    2

    log.txt    2    3    '    2    3

    log.txt    2    4    '    1    4# 输出顺序号 NR, 匹配文本行号

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!