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下标去重
取小数点后两位
保留整数,自动四舍五入向前进一