文本三剑客(grep sed awk)和正则表达式

linux的文本三剑客:

grep  sed  awk

grep:过滤(查找文本内容--正则表达式一块使用)查

sed:改

awk:对行来进行取列,awk自带编程,类java

(针对的都是文件内容)

grep命令都是对行来进行处理      grep方便对日志内容过滤

-m:多个匹配只取第一个 。-m后面要加数字,数字可以自定义

-n:显示匹配内容以及显示匹配的行号

-o:仅显示匹配到的字符串,不再输出其他内容

-A:after 后几行 显示匹配到行以及匹配行的后几行,自定义的(后面要跟数字)

-B:before 前几行 显示匹配到的行以及他的前几行,自定义

-C:前后各几行 显示匹配到行以及上下各几行,自定义

-e:实现逻辑或的关系

-E:使用正则表达式

-f:过滤出两个文件相同的内容

-r:递归目录下所有包含过滤内容的文件以及匹配的内容行,但是不处理软连接

-R:递归目录下所有包含过滤内容的文件以及匹配的内容行,但是处理软连接

两种方式查询

既可以用管道符查询也可以直接用命令查询

sort:以行为单位对文件内容进行排序,也可以根据不同的数据类型进行排序

sort 选项 参数

cat /etc/passwd | sort 选项

-b:忽略每行前面的空格,进行排序,而不是把空格缩进,偶空格也不影响排序

-n:按照数字进行排序(正向排序)

-r:反向排序

-u:去重,相同的数据行只显示一行

-o:输出文件,把排序的结果,输出到指定的内容文件

练习题:

怎么样不改变源文件的排序顺序,输出到另外一个文件中:

cat -n /etc/passwd | sort -n -o /opt/test.txt

快捷去重 uniq:报告或者忽略文件中连续的重复行,常于sort命令结合使用。

uniq 选项 参数

cat 文件 | uniq 选项

-c:统计连续重复的行的次数,合并重复的行

-u:显示仅出现一次的行(包括不连续的重复行)

-d:仅显示重复出现的行(必须是连续的重复行)

tr:对字符进行替换 压缩 删除

tr 选项 参数

echo 123 | tr 选项

常用选项:

-c:保留字符集1的字符,其他字符用字符集2来进行替换,必须要保留,然后替换

-d:删除字符

-s:将重复出现的字符串压缩成一个字符。替换字符集

相同行的内容不会压缩,只会压缩相同的字符

-t:替换

cut:对字段进行截取和剪裁

cut 选项 参数

cat 文件名 | cut 选项

-d:指定分隔符,截取字段

-f:对字段进行截取

cut -d ':' -f 1-3 /etc/passwd

以冒号为分隔符,截取1-3列

cut -d ':' -f 1,3 /etc/passwd

以冒号分隔符,截取1和3列

-b:以字节为单位截取

-c:以字符为单位截取

--complement:排除所指定的字段

--output-delimiter:更改原内容的分隔符

cut和awk有相似之处,都是对行来取列

cut的默认分隔符是tab键。主要是切文本,指定分隔符最好是指向性越强越好。

awk的默认分隔符就是空格,把多个连续的空格当做一个处理

文件拆分:split

可以把文件拆分成若干个小文件

split命令对文件进行拆分

-l:指定行数拆分

-b:指定文件大小进行拆分

(文件越大按照大小拆分,文件越小按照行数拆分)

分件合并:paste cat

paste 左右合并

cat   上下合并

练习题:

1.如何统计当前主机的连接状态

有多少个listen

              Estab

ss -nta | grep  -v “State” | cut -d “ “ -f 1 | sort | uniq -c

2.统计当前连接主机数

ss -nta | tr -s " " | cut -d " " -f 4 | sort -n | uniq -c

正则表达式:

匹配文件内容,根据特定的字符和表达式

linux下:grep sed awk

        nginx  mysql配置文件也可以支持正则表达式

通配符和正则表达式的区别:

通配符匹配的是文件名:

*:匹配任意一个或者多个字符

?:匹配任意一个字符

[]:可以是范围匹配,也可以单个字符匹配

正则表达式:

元字符

点 .  匹配任意单个字符,可以是一个汉字

转义符:\

():分组

\(\)=()

[]:匹配任意范围内的单个字符

使用正则表达式,一定要把匹配内容引起来

[^a-z]:取反

[[:blank:]] 匹配空格或者制表符(tab)

表示次数

*:匹配前面的字符任意次,包括0次,尽可能长的匹配

.*:匹配前面的字符任意次,但是不包括0次,也就是匹配所有

\?:匹配前面的字符出现0次,或者1次,有且只有一次

\+:匹配前面出现的字符,至少出现一次,也就是>=1

\{n\}:匹配前面出现的字符等于几次

\{m,n\}:匹配前面出现的字符最少m次,最多是n次

\{,n\}:匹配前面的字符最多n次,没有也算

\{n,\}:匹配前面的字符最少n次,只要连续出现n次,后面的都算

练习题:

位置锚定:

^:行首锚定,以什么为开头

$:行尾锚定,以什么为结尾

^root$:匹配行,单独的一行只有root

^$:开头为空(空白行)

^[[:space:]]*$:空白行

\<或者\b:词首锚定 用于匹配单词模式的左侧

从左往右全部都算,所有一起都包含,所有都算匹配到

\>或者\b:词尾锚定 用于匹配单词模式的右侧

只匹配右侧的单词,左侧的单词不匹配

\broot\b     \<root\>

匹配整个单词

分组以及逻辑或

():分组

\|:逻辑或

grep -E 扩展正则表达式

*:匹配前面的字符任意次,包括0次,尽可能长的匹配

.*: 匹配前面的字符任意次,但是不包括0次。也就是匹配所有。

?: 匹配前面的字符出现0次,或者1次,有且只有一次。

+:匹配前面出现的字符,至少出现一次,也就是>=1,

{n }:匹配前面出现的字符等于几次。

{m,n }:匹配前面出现的字符最少M次,最多是n次

{ ,n } : 匹配前面的字符最多N次,没有也算。

{ n, }: 匹配前面的字符最少N次,只要连续出现N次,后面的都算。

|:表示逻辑或

grep -E

egrep

扩展正则表达式这两个都可以

练习题:

sed编辑器:

文本三剑客:grep过滤文件内容 查

sed:行编辑器

sed也是按行来处理

sed是一种流编辑器。每一次处理内容,只有确认才会生效,不确认只是把模式空间的临时数据展示给用户,然后删除。

按照文本的行,一行一行向下处理,直到文件的最后一行

默认情况下:sed都是在模式空间执行,因此元文件不会发生变化。

sed的操作格式:

sed -e “操作” 文件1 文件2

sed -e “操作1;操作2” 文件

-e:指定的命令来处理输入的文本文件,只有一个操作,-e可以省略。多个指令才会用-e

-f:用特定的脚本文件来处理输入的文件

-i:立即生效(sed -i慎用!)

-n:仅显示script处理后的结果

sed的操作符:

p: 打印

=:只打印行号

d:删除行

sed -e ‘p’ test.txt

sed自己还有一个默认输出,再加上p打印,就有两行

-n就是禁止了默认输出

sed -n ‘2p’ test.txt

输出指定行的内容,只有第二行,其他的都没有

sed -n ‘=’ test.txt   =号,只显示行号

sed -n ‘$p’ test.txt 打印最后一行

打印1到3行        

打印第1行和第3行

打印第一行和最后一行        

n在p的前面,跳过当前一行,打印下一行

打印偶数行

p在n前面,打印当前一行,跳过下一行继续打印

打印奇数行

文本内容过滤---sed

sed -n ‘/th/p’ test.txt

双斜杠括起来p 打印

使用正则表达式进行过滤:

打印以root为开头

打印以bash为结尾

sed -r 使用扩展正则

{n}  {n,}  {n,m}  {,m}

从第四行开始向下一直打印到bash结尾为止

练习题:

1.包含有两个99:的所在行打印出来

2.打印所有要么是以root为开头,要么是以bash为结尾的行,打印

sed删除文件:

现在有一个文件,文件名我想保留,但是原有的内容我要删除掉

免交互删除

sed的操作符:

d:删除行

cat /dev/null > test.txt

sed -i 'd' test.txt

例题:

删除第三行,打印剩余的内容

删除第2行到第6行打印剩余

删除第5行到最后一行打印剩余

!:可以取反

保留第一行到第四行,其余删除

例题:

删除包含o的行

删除one到six行

处理one到six其他行都删除

根据正则表达式删除

删除过滤出非空行

sed修改,替换:

操作符:

s:表示替换字符串

c:整行替换

y:单字符替换,替换前后的字符长度要保持一致

这里的“p”不是表示打印的意思而是替换第几个出现的字符

“gp”:表示全局替换

以root为开头的替换成#。/etc/passwd

字母字符进行大小写替换

特殊符号:

l&:转换成小写的特殊符号,在前面加上转义符\

u&:转换成大写的特殊符号,在前面加上转义符\

大写换小写

小写换大写

整行替换

例题:

整行替换网卡IP地址

所有的o替换成1,n替换成2。长度要保持一致

sed命令:新增

a:在匹配行的下一行添加内容

I:在匹配行的上一行添加内容

r:可以从其他文件读取内容,然后在匹配行的行后添加

$a:可以直接在文本的最后一行添加内容

$i:在最后一行和倒数第二行之间添加内容(不推荐)

sed当中字符串和字符串的位置交换:

扩展正则和分组

直接通过文件内容当中的命令,修改第二个文件的内容

前一个是命令文件,后面一个执行文件

总结:

sed可以增删改查

sed也可以结合正则表达式

但是sed的最主要作用:改 增

使用sed命令时,注意大文件一定要分割之后再交给sed处理

搭配扩展正则:sed -r {n} {n,} {n,m} {,m}可以不需要加\

使用sed -i立即生效,要注意,事先做好测试,还要做好备份

awk

是文本三剑客之一,功能最强大的文本工具

逐行读取输入的文本内容,默认以空格和tab键作为分隔符,但是多个空格或tab键的空,会自动压缩成一个,按照指定的模式或者条件执行编辑命令。

也是逐行匹配,对符合条件的才会进行格式化输出或者过滤

可以在免交互的情况下实现复杂的文本操作,完成自动化的配置

awk  ‘操作符action’  file

     想干啥  怎么干 处理对象

awk ‘BEGIN{x=1};{x++};END{处理动作}’ 文件名

Awk ‘操作符 {处理动作}’ 文件名

{}外部表示定义条件   {}内部指定操作

BEGIN对条件做初始化操作

for ((i=1;i<=10;i++))

awk的常用选项

-F:指定分隔符,如果是空格,tab键,可以不加

-v:变量赋值,awk这个命令不能从外部获取变量值,只能在内部赋值

awk '{print}' /etc/passwd

打印文本内容

内置变量:

NR:需要处理行的行号

FS:列分隔符和F作用一致,如果用FS,FS=”:”

OFS:输出内容的列分隔符

打印行号

打印行号和文本内容(打印所有)

打印第三行

打印三到五行(两种方式)

打印第三行和第五行

打印偶数行

打印奇数行

awk的运算

一般运算,也可以小数运算

求幂的运算(两种方式)

awk按行取列

打印第二列和第三列

$NF:表示最后一列

打印第二列和最后一列(这里分隔符不是空格要加-F)

$n (><==):进行数值对比

$n~”字符串”:代表这个字段包含某个字符串

$n!~”字符串”:代表和这个字段不包含某个字符串(取反)

$n==”字符串”:代表这个字段要和字符串相同

$n!=”字符串”:取反,不为某个字段

$NF:代表最后一个字段

例题:

/etc/passwd,输出最后一个字段中包含bash所在行的第一个字段和最后一个字段

/etc/passwd,只有第一列是root的行,才打印它的第六列

输出最后一个字段不包含bash,然后打印第一列和第六列

指定第六个字段为/home/dn而且最后一个字段为/bin/bash,满足条件的输出你的第一列和最后一列

打印出所有第三列大于500的,然后输出全部内容

($0可加可不加)

awk的三元表达式:继承了java,格式也和java一样

awk’{条件表达式1?A表达式后者值:B表达式或者值}’ 文件名

? :分别对应if和else

awk -F: ‘{max=($3>=$4)?$3:$4;{print max $0}}’ /etc/passwd

文本内容匹配过滤打印

过滤出以root为开头的行

过滤出以bash为结尾的行

过滤出所有包含home的行

打印主机名(两种方式)

getline函数:getline和管道符以及重定向符号在一块的时候

重定向:< >把其中一个文件的内容传给另外一个

|:输出指定内容,到定义的变量,getline调用变量当中的内容,打印结果

getline函数运行之后会改变awk的内置变量,读取的行数也就会发生变化,getline在前,就是第一行跳过,打印第二行,偶数行

getline在后,从第一行开始,跳过第二行,打印的就是奇数

-v:给变量进行赋值

从awk里面传参

BEGIN模式:

对变量初始化:

索引下标的值是唯一的

awk和数组结合使用

定义数组:

练习题:用awk下标去重

取小数点后两位

保留整数,自动四舍五入向前进一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值