正则表达式
================================
    1.作用
              用人为规定一些特殊符号表示匹配字符串
              适用场景:模糊匹配字符串
       元字符:  正则表达式中具有特殊含义的字符,叫做元字符
    2.常用的元字符
              grep "^he"  1.txt -Hn   //匹配行首he
              (1) 逻辑或需要转义
                         grep "he\|ha"  1.txt  -Hn
              (2)不出现,或者出现一次  ?需要转义
                         grep "hel\?o"  1.txt  -Hn
                                     问号需要转义
                                     l\?表示l不出现,或者l出现一次
              (3)出现一次,后者出现多次   +需要转义
                        grep "hel\+o"  1.txt  -Hn
              (4)指定重复次数  {}左右两边需要转义
                        grep "hel\{2,4\}o"  1.txt  -Hn

awk和sed两个工具的使用
================================
    1.awk处理表格中列
             安装awk:  sudo  apt-get install  awk
             作用:主要用于统计表格中的信息,打印列
             注意的要点:
                        第一:  搜索字符串
                                awk  '$0~/你要匹配的字符串/ {print}'    要搜索的文件名
                               
                                .* 表示匹配任意长度的字符串
    2.sed也能处理表格数据
              安装sed:  sudo  apt-get install  sed
              作用:字符串的增删改查都可以
              命令总结:
                       第一:替换
                             sed  "s/旧字符串/新的字符串/"   people.txt

awk编程入门

测试文档:(grade.txt)

M.Tansley 05/2013 48311 Green 8 90

J.Lulu 04/2012 48317 green 12 88

P.bunny 02/2013 48 Yellow 9 70

J.Troll 09/2013 4842 Brown-3 11 95

L.Tansley 05/2013 4712 Brown-2 10 85

Vincent 07/2012 4712 Brown 13 87

1,打印指定列(例如名字和年龄)

awk  '{print $1,$5}'  grade.txt

注意:其中单引号中的被大括号括着的就是awk的语句,只能被单引号包含。

其中的$1..$n表示第几例。$0表示整个行。

注意:awk的工作次序是:首先读取grade.txt文件一个记录(即一行),然后根据单引号内部的指令工作,完了之后继续读下一行,以此类推。每读一行都会将单引号里面的语句从头到尾地应用到那一行中去。

2,格式化输出(和C语言一样一样的)

awk  '{printf"%-10s:%-d\n", $1,$5}'  grade.txt

3,过滤

awk  '$5==11 && $6>=90 {print $0}'  grade.txt

意思是==>打印出年龄等于11岁且分数大于90分的孩子的信息

4,打印表头,引入内建变量NR

awk  'NR==1 || $6>=90 {print}'  grade.txt

注意:NR是一个所谓的内建变量,表示已经读出的记录数(即行号)

其它有用的内建变量是:

$0

当前记录(这个变量中存放着整个行的内容)

$1~$n

当前记录的第n个字段,字段间由FS分隔

FS

输入字段分隔符 默认是空格或Tab

NF

当前记录中的字段个数,就是有多少列

NR

行号,从1开始,如果有多个文件这个值将不断累加。

FNR

  

当前记录数,与NR不同的是,这个值会是各个文件自己的行号

RS

  

输入的记录分隔符, 默认为换行符

OFS

  

输出字段分隔符, 默认也是空格

ORS

  

输出的记录分隔符,默认为换行符

FILENAME

  

当前输入文件的名字

5,指定分隔符

awk  ‘BEGIN{FS=”:”} {print $1}’  /etc/passwd

注意:BEGIN意味着紧跟在它后面的语句{FS=:}会在awk读取第一行之前处理。

上面的语句等价于

awk  -F:  ‘{print $1}’  /etc/passwd

如果有多个分隔符,则可以写成

awk  -F’[\t;:]’  ‘{print $1}’  /etc/passwd

6,使用正则表达式匹配字符串

awk  '$0~/Brown.*/ {print}'  grade.txt  意思是==>将所有包含Brown的行打印出来

注意:波浪号~后面紧跟着一对正斜杠,表示所指定的域(这里是$0)要匹配的规则

7,使用模式取反的例子

awk  '$0!~/Brown.*/ {print}'  grade.txt  意思是==>将所有不包含Brown的行打印出来

拆分文件

8,将各年龄段的孩子的信息分别存放在各个文件中

awk 'NR!=1 {print > $5}' grade.txt

意思是==>表头不处理,后面的每一行,都将被重定位到以第5个域(年龄)命名的文件中去。

也可以将指定的域重定位到相应的文件

awk 'NR!=1 {print $1, $6 > $5}' grade.txt

意思是==> 不处理表头,将每一行中的姓名和分数重定位到与其年龄相应的文件中去。

9,再复杂一点,按级别将信息分成三个文件:

awk 'NR!=1 {if($4~/Brown.*|Black/) print > "high.txt";

else if($4~/Yellow|[Gg]reen/) print > "midle.txt";

else print > "low.txt"}' grade.txt

意思是==> 如果记录中的第4个域($4)匹配Brown.*或者Black,就将该记录重定位到文件high.txt中,如果匹配Yellow或者[Gg]reen,就重定位到midle.txt中,否则统统重定位到low.txt中。

统计

10,将所有孩子的分数累积起来并打印出来

awk  '{sum+=$6} END{print sum}'  grade.txt

注意:END表示->紧跟其后的语句只会在awk处理完所有行之后才被执行。

11,统计各个级别的人数

awk 'NR!=1 {a[$4]++;} END{for(i in a) print i","a[i];}' grade.txt

注意:$4是级别名称,例如Yellow、Brown等,a是一个以这些级别为下标的数组,其值从零开始计算。i就是Yellow、Brown等   a[i]是对应有几个Yellow、Brown 中间用逗号隔开

awk脚本

12,想象我现在要打印出整个班级的所有孩子的信息,而且在最前面把表头也打印出来,而且下面要打印一行“===========”来跟具体内容加以划分。并且在最后一行,统计孩子们的平均年龄以及平均分数。将awk语句组织成脚本,如下:

#!/usr/bin/awk -f

#/usr/bin/awk指定脚本解释器的位置,-f表示运行该脚本需要指定一个文件作为输入

BEGIN{ #awk开始运行之前的准备工作(定义了两个变量),此左花括号必须紧跟BEGIN

age = 0

score = 0

}

{

if(NR==1) #打印表头已经分割线

{

print $0

printf "==============================" #由于是printf,没有\n就不换行

print  "==============================" #由于是print,会自动换行

}

else

{

age+=$5

score+=$6

print $0

}

}

END{ #awk处理完所有的记录之后,END才开始运行

printf "=============================="

print  "=============================="

print "Average:\t\t\t\t\t" age/NR  ",\t" score/NR

}

关于sed

测试文档:(people.txt)
Jack    is 18-year old, he comes from US.
Mike    is 16-year old, he comes from Canada.
Chen    is 21-year old, he comes from China.
Lau    is 18-year old, he comes from HongKong.
Michael    is 20-year old, he comes from UK.
Phoebe    is 18-year old, she comes from Australie.

1,替换:
例如,将"-year"改成" years":
sed  "s/-year/years/" people.txt

2,指定某些行替换:
例如,将第2行的"-year"改成" years":
sed  "2s/-year/years/" people.txt

再如,将第2至5行的"-year"改成" years":
sed  "2,5s/-year/years/" people.txt

3,直接通过sed修改原文,加选项 -i:
sed  -i "2s/-year/years/" people.txt
注意:sed缺省状态下不会修改原文

4,替换每一行中的所有的小写s成大写S:
sed  "s/s/S/g" people.txt
注意:g的意思是一行中所有的匹配项,否则缺省只会匹配第一个s

5,替换每一行中的第2个小写s成大写S:
sed  "s/s/S/2" people.txt

6,替换每一行中的第2个以后的小写s成大写S:
sed  "s/s/S/2g" people.txt

多个匹配
7,将"-year"改成" years",并且将第3行以后的最后一个任意字符去掉:
sed 's/-year/ years/; 3,$s/.$//' people.txt 
以上命令等价于:
sed -e 's/-year/ years/' -e '3,$s/.$//' people.txt
注意:在单引号里面,元义字符可以直接使用,如果要去掉元义则要在前面加\ ; 在双引号里面,sed的命令要使用元义,则需要加\ , 而命令的正则表达式要使用元义直接使用就行。

8,将&代替被匹配的变量:
sed "s/is/[&]/" people.txt
意思是==>:将文本中每一行出现的第一个is的左右两边加上[ ]

9,如果使用正则表达式匹配项的时候使用了圆括号括了起来,那么可以用\1,\2,\3……等来表示这些项:
sed "s/\(^.*\)\tis.*from \(.*\)./\1\t:\2/g" people.txt
分解一下:
1,其中加粗的\(^.*\)\tis.*from \(.*\).是正则表达式,简化一下是(^.*)\tis.*from (.*). 在这个表达式中,制表符\t前面的匹配项可以被记为\1,from后面的匹配项可以被记为\2
2,后面加下划线的\1\t:\2部分是替换的字符串,也就是只打印匹配出来的名字和国籍,中间用制表符和冒号隔开。

10,提前预读多一行缓冲来进行匹配:
sed 'N;s/is/IS/' people.txt
注意:由于替换只会针对第一个出现的单词is,而通过N又多读了一行,因此这个命令的结果是只会替换奇数行。

11,在指定行的前面插入(i)或者后面插入(a)一些信息:
sed '3i abcd' people.txt  意思是==>在第3行的前面插入abcd
sed '2a abcd' people.txt  意思是==>在第2行的后面插入abcd
sed '1,4a abcd' people.txt  意思是==>在第1至4行的后面分别插入abcd
sed '/US/a abcd' people.txt  意思是==>在匹配US的行的后面插入abcd

12,将指定的行替换成其他信息:
sed "2c ok" people.txt  意思是==>将第2行替换成ok

13,将指定的行删除掉:
sed ‘2d’ people.txt  意思是==>将第2行给删掉
sed ‘/US/d’ people.txt  意思是==>将匹配/US/的所有行给删掉
sed  '/\<he\>/d' people.txt 意思是==>将匹配he的所有行给删掉,注意:之所以要用<>将he给括起来,是因为不想匹配she,当然,<>需要转义,写成\<\>

14,打印指定匹配的行,用命令p:
sed '/Chen/p' people.txt  -n  意思是==>打印匹配Chen的行
sed '/Chen/, /Lau/p' people.txt  -n  意思是==>打印匹配Chen或者Lau的行
sed '3,/UK/p' people.txt  -n  意思是==>从第3行开始打印,直到匹配UK为止
sed '/UK/,6p' people.txt  -n  意思是==>从匹配UK的行开始打印,直到第6行为止

15,使用相对位置:
sed '/US/, +2p' people.txt -n  意思是==>打印匹配US的行,并打印其后的2行。

16,执行多个命令:
sed '{/he/{/18/p}}' people.txt -n 意思是==>匹配所有/he/的行之后,再匹配/18/的行,然后打印出来。

正则表达式-awk和sed两个工具的使用相关推荐

  1. Linux正则表达式和文本处理工具(gred、awk、sed)

    使用Linux 的 gred.awk.sed 可以方便得处理文本,然而若要灵活使用这三个工具,首先必须理解正则表达式.这里先对正则表达式进行学习,做点记录,之后再练习一下文本处理工具的使用. 正则表达 ...

  2. linux运维实战练习及linux shell脚本、awk、sed工具命令学习总结

    一.linux shell 脚本 1.描述shell程序的运行原理(可附带必要的图形说明): Linux系统的shell作为操纵系统的外壳,为用户提供使用操纵系统的接口.它是命令语言.命令解释程序及程 ...

  3. 三剑客(grep,awk,sed)+正则表达式

    grep grep -v 取反 除了root用户,显示其他用户 grep -m 数字 多个匹配的,只取第几个 grep -i 不区分大小写 grep -c 显示过滤的个数 grep -o 只显示匹配的 ...

  4. php 字符流在linux,PHP_linux正则表达式awk详解,awk和sed一样是流式编辑器,它 - phpStudy...

    linux正则表达式awk详解 awk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行.awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的.awk常用 ...

  5. linux隔行打印文本,详解正则表达式及Linux三大文本处理工具

    grep.sed和awk都是文本处理工具,虽然都是文本处理工具但却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了. 一.正则表达式 1.匹配字符的类型 [ ...

  6. linux生产文本处理掌握这些就够了:awk,gawk,sed,grep,sort

    shell脚本最常见的一个用途就是处理文本文件.检查日志文件.读取配置 文件.处理数据元素,shell脚本可以帮助我们将文本文件中各种数据的日常处理任务自动化.但仅靠shell脚本命令来处理文本文件的 ...

  7. linux三剑客awk、sed、grep与cut的总结

    在Linux中,一切皆文件,对Linux的操作就是对文件的处理.对文件操作处理最重要的三个命令是grep.sed.awk,它们在业界被称为"三剑客". 三剑客的功能非常强大,但它们 ...

  8. Linux Shell重定向 管道命令 grep搜索 awk编程 sed文件操作高阶函数

    在编程中如果能够熟悉shell高阶语法,将对我们进阶为高级程序员有很大的帮助,本文将从Shell重定向 管道命令 awk编程 sed等方面展开介绍. 作者:有勇气的牛排 文章目录 1 shell重定向 ...

  9. awk 和sed的用法介绍

    awk 和sed的用法介绍 一.awk的介绍 1. 作用及用法要求 2. 使用方法 (1)使用的命令: (2)举例说明: 二.sed的介绍 1. 用法介绍及常用命令 2. 具体使用 一.awk的介绍 ...

最新文章

  1. Citrix Avalon安装实验手册之一----Avalon概述及实验环境准备
  2. 添加墙元素实现碰撞效果
  3. ajax、offset
  4. 【边缘检测】BDCN:Bi-Directional Cascade Network for Perceptual Edge Detection
  5. 计算机网络课程设计之网络嗅探器的设计与实现
  6. 【华为云技术分享】原来CTR预估模型的发展有这样的规律
  7. 复制网页上无法选中的文字
  8. 怎么用python算单价和总价_用python计算最高投标限价
  9. android button layoutparams,使用LayoutParams设置布局
  10. Mathematica处理高斯光束的分布图像
  11. 英语单词-每天10个
  12. python 循环高级用法 [expression for x in X [if condition] for y in Y [if condition] ... for n in N [if con
  13. “约定优于配置”与Magento总结
  14. XML - 可扩展标记语言 (Extensible Markup Language)
  15. Eclipse BIRT报表开发工具安装教程
  16. 印度旅游业的兴衰,如同喜马拉雅山,连绵起伏 | 经济学人全球早报精选
  17. Word文件不能编辑是什么原因?
  18. Educoder头歌-Linux vi/vim编辑器
  19. 归并排序-小周的算法笔记
  20. ICML 2022|Pure Noise to the Rescue of Insufficient Data:Improving Imbalanced Classification by Train

热门文章

  1. druid连接mysql报错
  2. 惊!亚马逊封号潮提前结束;50%海外电商零售市场属于独立站;TikTok重返印度…|洞悉跨境
  3. P4909 Ski Lift G 题解
  4. 基于JavaWeb的绿色农业果蔬购物商城系统 课程报告+部署文档+项目源码及数据库文件
  5. signature=ae83778c2aa4dd8b9deb3ee108c1263d,何品達多媒體作品發表會含輔助文件《奎》原創作品與註釋...
  6. 一文速学 - PHP7特性
  7. 关于数据库科学计数法显示问题
  8. 图解选择排序算法及优化
  9. 4.4基于经验的测试技术
  10. HTML表单及表单控件