欢迎来到十九分快乐的博客

生死看淡,不服就干。

11.Linux三剑客:grep、awk、sed

三剑客 awk grep sed

1.awk #三剑客老大 过滤字符串 统计数据

​ 格式:awk '/查找的内容/' file #过滤筛选出文件中的内容

​ cat file|awk '/查找的内容/' #过滤筛选前面执行结果中的内容

1.1按行筛选文件:awk 'NR==2' passwd

​ 参数:==等于;!=不等于;<小于;并且&&;或者||

​ 按行匹配使用过滤字符串方式 #用途按时间段筛选

​ [root@oldboyedu ~]# awk '/root/,/daemon/' passwd #//,//筛选两个字符串间的内容

1.2按列筛选内容

​ 1.格式:awk '匹配模式{动作}' file # 如果前面没有匹配动作 则对整个文件进行操作

​ 参数:-F符号 #指定分隔符,awk按列查找内容 默认以空格和tab键分割

​ awk动作中:逗号 表示空格;NR 行号;NF 最后一列的列号;$1 $2 列;字母代表变量

​ 输出行号:awk -F: '{print NR}' 1.txt 加内容:awk -F: '{print NR,$0}' 1.txt

​ 输出最后一列的列号:awk -F: '{print NF}' 1.txt 最后一列内容:{print $NF} 倒数第二列:{print $(NF-1)}

​ 输出第一列带r的内容:awk -F: '$1~/r/' 1.tzt

​ 输出第一列等于jia的内容:awk -F: '$1=="jia"' 1.txt #字母代表变量,使用双引号变成字符串

​ 中括号 [] 里边的内容是or关系;中括号加 []+ 里的字符可以or和连续多个视为一个

​ [root@oldboyedu ~]# cat passwd

​ root:/x/:0:0:root:/root:/bin/bash

​ [root@oldboyedu ~]# awk -F "[😕]" '{print $3}' passwd #取出x那列[]+视x为第三列

​ [root@oldboyedu ~]# #awk -F "[😕]+" '{print $2}' passwd #取出x那列[]+视x为第二列

1.3统计数量wc

​ wc -l #统计行号

​ [root@sc ~]# awk '$0' 1.txt |wc -l #文件有多少行

​ wc -L #统计文件中最长的行的长度

​ [root@sc ~]# awk '$0' 1.txt |wc -L

1.4排序sort #默认按照首列字母或数字进行升序排序

​ 参数:-n 依照数值的大小排序

​ -r 以相反的顺序来排序

1.5 统计字符串出现的次数uniq -c #统计连续一样的自动加1,不一样从新开始,所有通常先排序后统计

​ 统计最后一列字符串出现次数:

​ awk -F: '{print $NF}' 1.txt |sort|uniq -c #排序再用管道sort

​ 统计系统三种用户数量:if()else if ()else

​ awk -F: '{if($3==0){a++} else if($3>0&&$3<1000){b++} else{c++}}END{print "管理员个数:"a,"\n虚拟用户个数:"b,"\n普通用户个数:"c}' /etc/passwd

1.6数值运算 BEGIN筛选前操作 END筛选后操作

​ awk 'BEGIN{print 100*100}'

2.sed #三剑客老二 取行 过滤字符串 增 删 改 查 替换

​ 格式:sed ’/过滤内容/‘ file #sed执行过程:一行一行的处理,如果对当前的行 没有动作 默认输出到屏幕

​ cat file|sed '/过滤字符串/' #nl file 显示文件行号

​ -n #取消默认输出

​ -i #修改源文件

2.1 sed 之 查内容 p输出到屏幕

​ 查root的行:sed -n '/root/p' passwd

​ 以root开头的行:sed -n '/^root/p' passwd

​ 以sh结尾的行:# sed -n '/sh$/p' passwd

​ 查区间行:sed -n '/root/,/adm/p' passwd

​ 查第三行:sed -n '3p' passwd

​ 查1到3行: sed -n '1,3p' passwd

​ 查最后一行:sed -n '$p' passwd

2.2 sed之增加内容

​ na :在n行后插入新的内容

​ 5行后:sed '5a hehe' 1.txt

​ root行后:sed '/root/a hehe' 1.txt

​ ni :在n行前插入新的内容

​ 5行前:sed '5i hehe' 1.txt

​ nc : 替换第n行的内容

​ 替换第五行内容:sed '5c hehe' 1.txt

2.3 删除内容 d

​ 格式:sed ’/筛选内容/d‘ file

​ 删除root行:sed '/root/d' 1.txt

​ 删除三行:sed '3d' 1.txt

2.4 替换内容 s###g

​ 格式:sed ’s#想要替换的内容#替换成什么内容#g‘

​ s:替换标志;g:全局替换; #没有g只替换第一个被找到的内容

​ 把root换成jia:sed 's#root#jia#g' 1.txt

​ 把:、/、数字替换成空格:sed 's#[:/0-9]# #g' 1.txt #以[]选定被替换的字符,中间不需要空格,连着写

统计1.txt中单词出现的次数:sed 's#[:/0-9]# #g' 1.txt |xargs -n1|grep -v x|sort|uniq -c|sort -rn
先替换干扰字符 n1每次只传递一个参数 去掉字母 排序 统计 再排序
2.5 y 转换脚本命令

​ sed ‘y/123/abc/’ file

​ 转换命令会对值进行一对一映射,文本中的1换成a,2换成b,3换成c,如果长度不同会报错

2.6 r 脚本命令 插入文件数据

​ sed ‘3r file’ jia file #将file文件中的内容插入jia文件的第三行

2.7 什么是Pattern Space(模式空间),Hold Space(保持空间)

​ Pattern Space相当于车间,sed把流内容在这里进行一行一行处理;Hold Space相当于仓库,加工的半成品在这里进行临时存储。

​ 1.高级指令:

​ h: 将pattern space中的内容拷贝到hold space中,原来hold space里的内容被覆盖

​ H: 将pattern space中的内容追加到hold space下一行

​ g: 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容被覆盖

​ G:将hold space中的内容追加到pattern space下一行

​ d: 删除pattern中的所有行,并读入下一新行到pattern中

​ D: 删除multiline pattern中的第一行,不读入下一行

​ 2.使文件中内容倒叙输出

​ 方法1:tac file

​ 方法2: nl file |sort -nr|cut -f2 #nl 内容显示行号

​ 方法3:sed ‘1!G;h;$!d’ file #1!G 第一行不执行G命令,从第二行开始执行,$!d 最后一行不删除

​ 图解: 1605187180186

3.grep # 三剑客老三 过滤字符串

​ 格式:grep '过滤的内容' file # 直接跟文件过滤

​ cat 文件|grep '过滤的内容' # 过滤其他命令的输出结果

​ 参数:-n 显示过滤到内容的行号

​ -o 查看匹配过滤过程

​ -v 取反

​ -E 支持扩展正则 | 或者egrep '^$|#'

​ 单引号和双引号的区别 不加引号?

​ 单引号不能解析变量;双引号和不加引号可以解析变量

​ 正则 . 代表了任意单个字符

3.1 正则 ^ 以什么什么开头的行

​ [root@oldboyedu ~]# grep ^r passwd

3.2 $ 以什么什么结尾的行

​ [root@oldboyedu ~]# grep nologin$ passwd

3.3 -v 对查找到的内容进行取反

​ [root@oldboyedu ~]# grep -v '^$' /etc/selinux/config #查找不要空格的行

3.4 多个条件筛选

​ [root@oldboyedu ~]# grep -v '^$' /etc/selinux/config|grep -v '#' #通过管道多次筛选

-E 支持扩展正则 | 或者egrep '^$|#'

​ [root@oldboyedu ~]# egrep -v '^$|#' /etc/selinux/config #增加多个条件用|隔开

统计文件中字母出现个数:grep '.' 1.txt -o|egrep -v '[0-9:/]'|sort|uniq -c|awk '{print $2,$1}'

.点筛选全部 -o显示筛选过程(变成一列)过滤掉不是字母的字符 排序 统计 指定输出列

posted @ 2020-11-12 18:07  十九分快乐  阅读(88)  评论(0编辑  收藏  举报