文本三剑客

正则表达式

又称规则表达式,计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

许多程序设计语言都支持利用正则表达式进行字符串操作。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。

  • 正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,我们下面会给予解释。
元字符描述
\转义符

^

匹配输入字行首

$

匹配输入行尾

*

匹配前面的子表达式任意次

\{n\}

匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。

\{n,\}

n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。

\{n,m\}

mn均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。

.点

匹配除“\n”和"\r"之外的任何单个字符

x|y

匹配x或y。例如,“z|food”能匹配“z”或“food”(此处请谨慎)。“[z|f]ood”则匹配“zood”或“food”。

[xyz]

字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。

[^xyz]

负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”任一字符。

[a-z]

字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。

[^a-z]

负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。

\<\>

匹配词(word)的开始(\<)和结束(\>)。例如正则表达式\<the\>能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:这个元字符不是所有的软件都支持的。
|

将两个匹配条件进行逻辑“或”(or)运算。例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。

  • 举例
  1.  ^$ 匹配空行
  2. [^b-d] 匹配不在b-d范围内的所有字符

grep

grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。

grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep

 

  • 参数说明
-c:只输出匹配行的计数。 
-i:不区分大小写。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
--color=auto :可以将找到的关键词部分加上颜色的显
  • 举例
  1. grep ‘test’ d*    显示所有以d开头的文件中包含 test的行。
  2. grep ‘test’ aa bb cc  显示在aa,bb,cc文件中匹配test的行。
  3.  grep ‘[a-z]\{5\}’ aa  显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
  4. grep -r   明确要求搜索子目录:或忽略子目录:grep -d skip
  5. grep -i pattern files :不区分大小写地搜索。默认情况区分大小写
  6. grep -l pattern files :只列出匹配的文件名
  7. grep -L pattern files :列出不匹配的文件名
  8. grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’)
  9. grep -C number pattern files :匹配的上下文分别显示[number]行
  10. grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行
  11. grep "abc\|xyz" testfile 表示过滤包含abc或xyz的行
  12. grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。
  13. grep -n pattern files 即可显示行号信息 grep -c pattern files 即可查找总行数

这里还有些用于搜索的特殊符号:
\< 和 \> 分别标注单词的开始与结尾。

例如:

grep man * 会匹配 ‘Batman’、’manic’、’man’等,
grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’,

sed

sed是一种流编编器,处理时,把当前处理的行存储在临时缓冲区中,称为”模式空间”( oattern space),接看用sed命令处理缓冲区中的内容,处理成后,把缓冲区的内容送往屏幕显示。接着理下一行,这样不断重复,直到文件末。

命令选项:

  1. -e 多个命令 在处理输入时,将多个命令中指定的命令添加到运行的命令中
  2. -f file 在处理输入时,将file中指定的内容添加到运行的命令中
  3. -n 不要为每个命令生成输出,等待print命令来输出

参数:

  1. p    ##显示
  2. d    ##删除
  3. a    ##添加
  4. c    ##替换
  5. i    ##插入
  • 举例
[root@server1 three]# sed -e 's/run/dance/;s/my/he/' info 
he favourite sports is dance.
he favourite sports is dance.
he favourite sports is dance.
he favourite sports is dance.
he favourite sports is dance.
he favourite sports is dance.
[root@server1 three]# sed -f s info 
his favourite sports is dance.
his favourite sports is dance.
his favourite sports is dance.
his favourite sports is dance.
his favourite sports is dance.
his favourite sports is dance.
[root@server1 three]# cat s
s/my/his/
s/run/dance/
[root@server1 three]# sed -n 's/gaoqi/her/p' info 
her favourite sports is run.

awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

使用方法   : awk '{pattern + action}' {filenames}

尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

awk内置变量

1

2

3

4

5

6

7

8

9

10

11

12

ARGC               命令行参数个数

ARGV               命令行参数排列

ENVIRON            支持队列中系统环境变量的使用

FILENAME           awk浏览的文件名

FNR                浏览文件的记录数

FS                 设置输入域分隔符,等价于命令行 -F选项

NF                 浏览记录的域的个数(几列)

NR                 已读的记录数(几行)

OFS                输出域分隔符

ORS                输出记录分隔符

RS                 控制记录分隔符

$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。

1

$NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数

常用的命令展示

  • awk擅长列输出

搜索/etc/passwd有root关键字的所有行

1

awk  '/root/' /etc/passwd 【这种是pattern的使用,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)】

搜索/etc/passwd有root关键字的所有行,并显示对应的shell

1

awk -F: '/root/ {print $7}' /etc/passwd

image

 

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

1

awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

image

使用printf替代print,可以让代码更加简洁,易读

1

awk -F: '{printf ("filename:%10s, linenumber:%3s,column:%3s,content:%3f\n",FILENAME,NR,NF,$0)}' /etc/passwd

image

打印/etc/passwd/的第二行信息

1

awk -F: 'NR==2{print "filename: "FILENAME, $0}' /etc/passwd

image

 

awk的过滤使用方法

1

ls -lF | awk '/^d/'

image
指定特定的分隔符,查询第一列

1

awk -F ":" '{print $1}' /etc/passwd

image
指定特定的分隔符,查询最后一列

1

awk -F ":" '{print $NF}' /etc/passwd

image
指定特定的分隔符,查询倒数第二列

1

awk -F ":" '{print $NF-1}' /etc/passwd

image
获取第12到31行的第一列的信息

1

awk -F ":"  '{if(NR<31 && NR >12) print $1}' /etc/passwd

image

多分隔符的使用:

1

2

[root@localhost ftl]# awk -F "[/]" 'NR == 4 {print $0,"\n",$1}' /etc/passwd

这里以/为分隔符,多个分隔符利用[]然后在里面写分隔符即可

image

添加了BEGIN和END

1

[root@localhost ftl]# cat /etc/passwd | awk -F: 'BEGIN{print "name, shell"} {print $1,$NF} END{print "hello  world"}'

image

查看最近登录最多的IP信息

1

[root@localhost ftl]# last | awk '{S[$3]++} END{for(a in S ) {print S[a],a}}' |uniq| sort -rh

image

 利用正则过滤多个空格

1

[root@localhost ~]# ifconfig |grep eth* | awk -F '[ ]+' '{print $1}'<br><br>

 

awk编程--变量和赋值

除了awk的内置变量,awk还可以自定义变量, awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。

统计某个文件夹下的大于100k文件的数量和总和

1

2

ls -l|awk '{if($5>100){count++; sum+=$5}} {print "Count:" count,"Sum: " sum}'  【因为awk会轮询统计,所以会显示整个过程】

ls -l|awk '{if($5>100){count++; sum+=$5}} END{print "Count:" count,"Sum: " sum}' 【天界END后只显示最后的结果】

1

<strong>备注:</strong>count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开

image

统计显示/etc/passwd的账户

1

2

3

awk -F: '{count++;} END{print count}' /etc/passwd        

cat /etc/passwd|wc -l

awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd

image

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值