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 最后一行不删除
图解:
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显示筛选过程(变成一列)过滤掉不是字母的字符 排序 统计 指定输出列