Linux基础-三剑客

13 阅读4分钟

1.grep

作用: 模糊过滤文件的内容
1.-v  取反        
*****
2.-r  递归过滤    *****
3.-i  不区分大小写
4.-w  精确匹配
5.-o  匹配过程
6.-E  支持扩展正则 等同于egrep
7.-A  显示过滤到内容的后 n行
8.-B  显示过滤到内容的前 n行
9.-C  显示过滤到内容的前后各n行
10.-n 显示到过滤内容的行号
11.-c 统计某个单词出现的次数-r 案例: 递归过滤目录及目录下下所有文件的内容
配置环境:
[root@db01 ~]# mkdir oldboy
[root@db01 ~]# echo www.baidu.com > oldboy/code.txt
[root@db01 ~]# cd oldboy/
[root@db01 oldboy]# ll
total 4-rw-r--r-- 1 root root 14 Mar 18 08:48 code.txt
[root@db01 oldboy]# mkdir test
[root@db01 oldboy]# echo www.baidu.com > test/1.txt
[root@db01 oldboy]# ll
total 4-rw-r--r-- 1 root root 14 Mar 18 08:48 code.txt
drwxr-xr-x 2 root root 19 Mar 18 08:49 test
过滤出当前目录及以下所有文件中包含www.baidu.com的文件
[root@db01 oldboy]# cat code.txt 
www.baidu.com
[root@db01 oldboy]# cat test/1.txt 
www.baidu.com
[root@db01 oldboy]# grep 'www.baidu.com' *
code.txt:www.baidu.com
grep: test: Is a directory  # test 是一个目录
[root@db01 oldboy]# grep -r 'www.baidu.com' *
code.txt:www.baidu.com
test/1.txt:www.baidu.com
或者:
[root@db01 oldboy]# find ./ -type f
./code.txt
./test/1.txt
[root@db01 oldboy]# find ./ -type f|xargs grep www.xiaoze.com
./test/1.txt:www.xiaoze.com
统计日志中出现Failed的次数
[root@db01 ~]# grep -c Failed /var/log/secure
3

2.sed

案例1.指定行查找

语法格式:   sed -n '3p' 文件   # print 打印输出    
            cat 文件|sed -n '3p'
[root@db01 ~]# head -5 /etc/passwd > test.txt
[root@db01 ~]# sed -n '3p' test.txt
显示文件的最后一行:
[root@db01 ~]# sed -n '$p' test.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
过滤区间范围: sed -n '2,4p' 文件
过滤文件的2-4行
[root@db01 ~]# sed -n '2,4p' test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
显示文件的第2行到最后一行
[root@db01 ~]# sed -n '2,$p' test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
处理屏幕上显示的内容
[root@db01 ~]# ifconfig eth0|sed -n '2p'
        inet 10.0.0.200  netmask 255.255.255.0  broadcast 10.0.0.255

案例2.模糊过滤文件内容

语法结构:        sed -n '/过滤的内容/p' file
[root@db01 ~]# sed -n '/root/p' test.txt 
root:x:0:0:root:/root:/bin/bash
使用正则:
[root@db01 ~]# sed -n '/^r/p' test.txt 
root:x:0:0:root:/root:/bin/bash
过滤以a或b或c开头的行
[root@db01 ~]# sed -n '/^[a-c]/p' test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
过滤以什么结尾的行
[root@db01 ~]# sed -n '/h$/p' test.txt
root:x:0:0:root:/root:/bin/bash
[root@db01 ~]# sed -n '/n$/p' test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
过滤区间范围:
sed -n '//,//p' 文件
sed -n '2,4p'  文件
过滤字符串区间范围:
[root@db01 ~]# sed -n '/^bin/,/^a/p' test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
案例: 过滤时间 统计上午8点到中午12点中间数据
[root@linuxnc ~]# sed -n '/2024:08:00:15/,/2024:09:30:42/p' /var/log/nginx/access.log
注意匹配方式:
[root@db01 ~]# cat a.txt
aaa
bbb
ccc
bbb
uuu
ddd
eee
fff
ddd
xxx
[root@db01 ~]# sed -n '/bbb/,/ddd/p' a.txt
bbb
ccc
bbb
uuu
ddd

案例3.sed之删除

指定行删除:
语法格式:  sed '3d' file  # 默认不会修改源文件
修改源文件 sed -i '3d' file
案例1.删除文件的第3行
[root@db01 ~]# sed '3d' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例2.删除2到4行
[root@db01 ~]# sed '2,4d' test.txt
root:x:0:0:root:/root:/bin/bash
案例3.删除2到最后一行
[root@db01 ~]# sed '2,$d' test.txt
模糊过滤内容,然后删除
语法结构:  sed '/字符串/d' file
删除包含root的行
[root@db01 ~]# sed '/root/d' test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
删除b开头的行
[root@db01 ~]# sed '/^b/d' test.txt
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin-r 支持扩展正则  |或者的意思
[root@db01 ~]# sed -rn '/^bin|^lp/p' test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
删除bin开头或者lp开头的行
[root@db01 ~]# sed -r '/^bin|^lp/d' test.txt 
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
匹配区间范围进行删除:
[root@db01 ~]# sed '/^bin/,/^adm/d' test.txt 
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

案例4.sed 替换

语法结构:
sed 's#将谁#替换成谁#g' 文件
sed 's@@@g' 文件
sed 's///g' 文件
案例: 只替换每行的第一个单词 root为oldboy
[root@db01 ~]# sed 's#root#oldboy#' test.txt 
oldboy:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例: 替换所有的root为oldboy
[root@db01 ~]# sed 's#root#oldboy#g' test.txt
oldboy:x:0:0:oldboy:/oldboy:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
oldboy:x:0:0:oldboy:/oldboy:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例: 将root替换成空
[root@db01 ~]# sed 's#root##g' test.txt 
:x:0:0::/:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
:x:0:0::/:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
案例: 删除所有的数字
[root@db01 ~]# sed 's#[0-9]##g' test.txt 
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
root:x:::root:/root:/bin/bash
lp:x:::lp:/var/spool/lpd:/sbin/nologin
案例: 删除所有的字符串

[root@db01 ~]# sed 's#[a-z]##g' test.txt 
::0:0::/://
::1:1::/://
::2:2::/://
::3:4:://://
::0:0::/://
::4:7::///://
[root@db01 ~]# sed 's#[0-z]##g' test.txt 
:::::/://
:::::/://
:::::/://
::::://://
:::::/://
:::::///://
案例: 统计passwd中每个单词出现的次数 top10
将特殊符号替换成空
[root@db01 ~]# sed 's#[:/0-9x]# #g' test.txt 
root       
root  root  bin bash
bin       
daemon       
adm       
root       
lp       
bin  bin  sbin nologin
daemon  sbin  sbin nologin
adm  var adm  sbin nologin
root  root  bin bash
lp  var spool lpd  sbin nologin
[root@db01 ~]# sed 's#[:/0-9x]# #g' test.txt |xargs -n1|sort |uniq -c|sort -rn|head
6 root
5 sbin
5 bin
4 nologin
3 adm
2 var
2 lp
2 daemon
2 bash
1 spool
边界符:
[root@db01 ~]# sed  's#\bbin\b#oldboy#g' test.txt
或者:
[root@db01 ~]# sed  's#\<bin\>#oldboy#g' test.txt 
root:x:0:0:root:/root:/oldboy/bash
oldboy:x:1:1:oldboy:/oldboy:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
root:x:0:0:root:/root:/oldboy/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
注意: 语法冲突需要使用撬棍\ 或者换个语法
[root@db01 ~]# 
[root@db01 ~]# sed 's/\/root/\/oldboy/g' test.txt
或者
[root@db01 ~]# sed 's#/root#/oldboy#g' test.txt
动作: 
sed -n '3p' 文件
sed  's###g' 文件
模式+动作
模式: 找谁,如何找
sed -n '3p' # 找第3行
演变: 将p输出动作 修改为替换动作
[root@db01 ~]# sed  '3s#sbin#oldboy#g' test.txt # 将第3行的sbin替换成oldboy
案例: 将2到4行的nologin替换成oldboy
[root@db01 ~]# sed '2,4s#nologin#oldboy#g' test.txt
root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/oldboy
daemon:x:2:2:daemon:/sbin:/sbin/oldboy
adm:x:3:4:adm:/var/adm:/sbin/oldboy
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@db01 ~]# sed '/adm/s#adm#oldboy#g' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
oldboy:x:3:4:oldboy:/var/oldboy:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
区间范围:
[root@db01 ~]# sed '/adm/,/lp/s#[a-z]##g' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
::3:4:://://
::0:0::/://
::4:7::///://

案例5.sed 追加 插入 替换 后向引用

1. i 插入 在第3行写入aaa
[root@db01 ~]# sed '3i aaa' test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
aaa
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
2. a追加 在第3行的下一行 在第4行写入aaa
[root@db01 ~]# sed '3a aaa' test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
aaa
adm:x:3:4:adm:/var/adm:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
3. c替换 替换整行内容
[root@db01 ~]# sed '3c aaa' test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
aaa
adm:x:3:4:adm:/var/adm:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
替换第7行的内容关闭selinux
[root@db01 ~]# sed -i '7c SELINUX=disabled' /etc/selinux/config
4. w 保存 将找到的行保存到新的文件中
[root@db01 ~]# sed '4w new.txt' test.txt
保存2到4行的内容到new.txt
[root@db01 ~]# sed -n '2,4w new.txt' test.txt 
[root@db01 ~]# cat new.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@db01 ~]# 
sed后向引用:
语法结构:  sed s#()()()#\1\2\3#g
[root@db01 ~]# echo oldboy|sed -r 's#(.*)#\1#g'
oldboy
[root@db01 ~]# 
[root@db01 ~]# echo oldboy|sed -r 's#ol(.*)oy#\1#g'
db
[root@db01 ~]# echo oldboy|sed -r 's#ol(.*)(oy)#\2#g'
oy
[root@db01 ~]# echo oldboy|sed -r 's#(ol)(.*)(oy)#\1#g'
ol
[root@db01 ~]# echo oldboy test|sed -r 's#(.*)#\1#g'
oldboy test
[root@db01 ~]# echo oldboy test|sed -r 's#(.*) test#\1#g'
oldboy
案例: 取出IP地址
[root@db01 ~]# ifconfig eth0|sed -n '2p'|sed -r 's#^.*t (.*)  netm.*$#\1#g'
10.0.0.200
第二种用户: 命令拼接后交给bash执行
[root@db01 ~]# seq 5|sed -r 's#(.*)#touch \1.txt#g'
touch 1.txt
touch 2.txt
touch 3.txt
touch 4.txt
touch 5.txt
[root@db01 ~]# seq 5|sed -r 's#(.*)#touch \1.txt#g'|bash
[root@db01 ~]# ll
total 20-rw-r--r-- 1 root root  18 Mar 18 11:46 1.txt-rw-r--r-- 1 root root   0 Mar 18 11:46 2.txt-rw-r--r-- 1 root root   0 Mar 18 11:46 3.txt-rw-r--r-- 1 root root   0 Mar 18 11:46 4.txt-rw-r--r-- 1 root root   0 Mar 18 11:46 5.txt
# 批量创建用户
[root@db01 ~]# echo test{1..3}
test1 test2 test3
[root@db01 ~]# echo test{1..3}|xargs -n1
test1
test2
test3
[root@db01 ~]# echo test{1..3}|xargs -n1|sed -r 's#(.*)#\1#g'
test1
test2
test3
[root@db01 ~]# echo test{1..3}|xargs -n1|sed -r 's#(.*)#useradd \1#g'
useradd test1
useradd test2
useradd test3
[root@db01 ~]# echo test{1..3}|xargs -n1|sed -r 's#(.*)#useradd \1#g'|bash

sed小结:

sed -i 修改源文件
sed -r 支持扩展正则
sed -n 取消默认输出
 
 
 
 
1.指定行查找
  sed -n '3p'   file
  sed -n '3,6p' file 
2.模糊过滤
  sed -n '/过滤的内容/p' file
  sed -n '//,//p' file
  正则:
  sed -n '/^a/p' file
  sed -n '/n$/p' file
  sed -rn '/^a|h$/' file
3.删除
  sed '3d'   file 
  sed '3,6d' file
  模糊过滤后删除
  sed '/root/d' file
  sed '//,//d'  file
4.替换
  sed 's/将谁/替换成谁/g' file s是单字符替换
  sed 's###g'
  注意: 如果涉及到变量需要使用双引号
模式+动作
  sed '3s#bin##g' file  # 将第3行的bin替换成空,删除的意思
  sed '3,10s###g' file
  sed '/root/s#bin#oldboy#g' file
其他参数:
   sed '3a  aaa'
   sed '3i  aaa'
   sed '3c  aaa' c是change,整行替换
   sed '3w  test.txt'
   sed -r 's#()#\1#g' file
   
作业: 练习sed 笔记
     复习-->
     系统重要配置文件
     系统优化
     文件属性:
             1.inode block
             2.文件类型 zero null
             3.软件安装 yum  rpm
             4.find查找文件
             5.tar zip打包压缩
             6.软硬链接
             7.grep 过滤内容