三剑客grep \sed/awk
grep
用户过滤命令
参数 作用 -i(常用) 搜索时,忽略大小写 -c(常用) 统计过滤成功的行数 -l 只列出符合匹配的文件名,不列出具体的匹配行 -n(常用) 列出所有的匹配行,显示行号 -h 查询多文件时不显示文件名 -s 不显示不存在、没有匹配文本的错误信息 -v 显示不包含匹配文本的所有行(取反) -w(常用) 匹配整词 -x 匹配整行 -r 递归搜索 -q(常用) 禁止输出任何结果,已退出状态表示搜索是否成功 -b 打印匹配行距文件头部的偏移量,以字节为单位 -o 与-b结合使用,打印匹配的词据文件头部的偏移量,以字节为单位 -A 2 显示的时候加上后两行 -B 2 显示的时候加上前两行 -C 2 显示的时候增加前后两行 #语法 grep [选项] [正则] [文件] #案例 [root@tencent_cloud test]# grep -rl "nginx" /etc/nginx/ /etc/nginx/koi-utf /etc/nginx/nginx.conf /etc/nginx/win-utf /etc/nginx/fastcgi_params #可以通过关键字查找相关的配置文件,当然也可以用rpm -qc nginx正则表达式的用法
符号 作用 ^ 匹配从头开始对(中括号外)(中括号内是取反的意思) $ 匹配从尾开始对 . 匹配任意一个字符 * 左边的字符出现0次或无穷次 .* 匹配所有的,默认是匹配到最远的 .*? 匹配所有的,改为非贪婪匹配,需要指定-P [ ] 匹配指定范围的任意一个字符 + 左边的字符出现1次或无穷次(egrep / grep -E才好用)
案例
用于过滤的命令 参数 作用 -i(常用) 搜索时,忽略大小写 -c(常用) 统计过滤成功的行数 -l 只列出符合匹配的文件名,不列出具体的匹配行 -n(常用) 列出所有的匹配行,显示行号 -h 查询多文件时不显示文件名 -s 不显示不存在、没有匹配文本的错误信息 -v 显示不包含匹配文本的所有行(取反) -w(常用) 匹配整词 -x 匹配整行 -r 递归搜索 -q(常用) 禁止输出任何结果,已退出状态表示搜索是否成功 -b 打印匹配行距文件头部的偏移量,以字节为单位 -o 与-b结合使用,打印匹配的词据文件头部的偏移量,以字节为单位 -A 2 显示的时候加上后两行 -B 2 显示的时候加上前两行 -C 2 显示的时候增加前后两行 #语法 grep [选项] [正则] [文件] #案例 [root@tencent_cloud test]# grep -rl "nginx" /etc/nginx/ /etc/nginx/koi-utf /etc/nginx/nginx.conf /etc/nginx/win-utf /etc/nginx/fastcgi_params #可以通过关键字查找相关的配置文件,当然也可以用rpm -qc nginx 符号 作用 ^ 匹配从头开始对(中括号外)(中括号内是取反的意思) $ 匹配从尾开始对 . 匹配任意一个字符 * 左边的字符出现0次或无穷次 .* 匹配所有的,默认是匹配到最远的 .*? 匹配所有的,改为非贪婪匹配,需要指定-P [ ] 匹配指定范围的任意一个字符 + 左边的字符出现1次或无穷次(egrep / grep -E才好用) ^ [root@tencent_cloud ~]# grep -n "^root" tests #取第一个是root 1:root:x:0:0:root:/root:/bin/bash $ [root@tencent_cloud ~]# grep -n "bash$" tests #取结尾是bash的 1:root:x:0:0:root:/root:/bin/bash 26:lighthouse:x:1000:1000::/home/lighthouse:/bin/bash 28:mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash 29:baimo:x:1001:1001::/home/baimo:/bin/bash . [root@tencent_cloud test]# cat a.txt abc a+c a-c a1c aaaaaaaaaaaaaaaac bbbbbbbbc cccc dddd [root@tencent_cloud test]# grep -n "a.c" a.txt 1:abc 2:a+c 3:a-c 4:a1c 5:aaaaaaaaaaaaaaaac * [root@tencent_cloud test]# cat a.txt a ab abbcccc abbbbbbbbbbbbbbbbccc bbbbbbbbbbbbb aaaaaaaaaaaaaaaab [root@tencent_cloud test]# grep "ab*" a.txt a ab abbcccc abbbbbbbbbbbbbbbbccc aaaaaaaaaaaaaaaab #他这个匹配规则是,a是必须要有的,如果后面有多个a就一起拿走,b可有可无,有就都拿走,直到不是b为止 .* [root@tencent_cloud test]# cat a.txt a123123213c3123123c ac a=-*(0c cccccca123123c [root@tencent_cloud test]# grep "a.*c" a.txt #贪婪匹配,从a开始到整行c结尾 a123123213c3123123c ac a=-*(0c cccccca123123c .*? [root@tencent_cloud test]# cat a.txt <a href="http://www.baidu.com">我是百度</a><a href="http://www.sina.com.cn">新浪</a> 1111 2222 3333 [root@tencent_cloud test]# grep -Po '".*?"' a.txt #这里一定要指定-P,使用?的时候 "http://www.baidu.com" "http://www.sina.com.cn" [] [root@tencent_cloud test]# cat >a.txt<<EOF > abc > aBc > a1c > a2c > EOF [root@tencent_cloud test]# grep 'a[a-z]c' a.txt abc [root@tencent_cloud test]# grep 'a[A-Z]c' a.txt aBc [root@tencent_cloud test]# grep 'a[a-zA-Z]c' a.txt abc aBc [root@tencent_cloud test]# grep 'a[0-9]c' a.txt a1c a2c #注意:[]内的减号代表的是范围的意思,如果要匹配-符号的话需要将-放在左右两侧 [root@www1 ~]# cat i.txt a+c a-c a*c a/c a1c a2c [root@www1 ~]# grep 'a[+-*/]c' i.txt #报错 grep: Invalid range end [root@www1 ~]# grep 'a[+\-*/]c' i.txt #报错 grep: Invalid range end [root@www1 ~]# grep 'a[+*/-]c' i.txt #OK a+c a-c a*c a/c #注意:!在[]就是符号的意思,没有取反的意思,括号内取反需要用^ [root@www1 ~]# cat i.txt a+c a-c a*c a/c a1c a2c a!c [root@www1 ~]# grep 'a[!+*/-]c' i.txt a+c a-c a*c a/c a!c [root@www1 ~]# grep 'a[^!+*/-]c' i.txt a1c a2c + [root@tencent_cloud test]# cat a.txt a ab abbcccc abbbbbbbbbbbbbbbbccc bbbbbbbbbbbbb aaaaaaaaaaaaaaaab [root@tencent_cloud test]# grep -n "ab*" a.txt 1:a 2:ab 3:abbcccc 4:abbbbbbbbbbbbbbbbccc 6:aaaaaaaaaaaaaaaab [root@tencent_cloud test]# egrep -n 'ab+' a.txt #这里要配合egrep或者grep -E使用 2:ab 3:abbcccc 4:abbbbbbbbbbbbbbbbccc 6:aaaaaaaaaaaaaaaab [root@tencent_cloud test]# grep -En 'ab+' a.txt 2:ab 3:abbcccc 4:abbbbbbbbbbbbbbbbccc 6:aaaaaaaaaaaaaaaab #!/bin/bash while true do read -p "请输入用户名>>:" inp_name read -p "请输入用户密码>>:" inp_pwd if [[ $inp_pwd =~ ^[0-9]+$ ]];then #这里正则作为if的条件的时候需要加双[],等于的时候需要用=~ echo "登录成功" break else echo "请输入数字,小垃圾" continue fi done 定位到某一行,将某一行的某一部分给替换掉 定位到某一行,然后删除 定位到某一行,在该行后添加新的配置 #定位 sed -r "定位+操作" test.txt #-r启用扩展正则表达式,""内是规则 sed -r "3,5+操作" test.txt #第三行到第五行进行操作 sed -r "3+操作;5+操作" test.txt #第三行和第五行 sed -r "/正则/+操作" test.txt #正则定位行 #操作 g #从左换到右 i #忽略大小写 定位到某一行替换掉 定位到某一行可以用行号,或者正则 #指定行 [root@tencent_cloud test]# cat a.txt egonxxx egonyyyEGONzz egon [root@tencent_cloud test]# sed -r "1s/egon/666/g" a.txt #指定行 666xxx egonyyyEGONzz egon [root@tencent_cloud test]# sed -r "/^egon/s/egon/666/gi" a.txt #正则指定行 666xxx 666yyy666zz 666 #第一到第三行 [root@tencent_cloud test]# sed -r "1,3s/egon/666/g" a.txt 666xxx 666yyyEGONzz 666 #第一行和第三行 [root@tencent_cloud test]# sed -r "1s/egon/666/g;3s/egon/666/g" a.txt 666xxx egonyyyEGONzz 666 sed -r "1,3d" new.txt sed -r "/^[0-9]/d" new.txt 定位到某一行,在改行后添加新的配置 sed -r "1a XXXXXXXXXXXXXXXX" new.txt 定位到某一行,将整行修改掉 sed -r "1c XXXXXXXXXXXXXXXX" new.txt 善长做有规律的列处理 -F #指定分隔符,不指定默认空格 #这里有个注意点,awk全部使用'' awk -F: '定位{}' 文件路径 awk -F: 'NR==3{print $1,$7}' /etc/passwd #第三行第一列和第七列 awk -F: 'NR>=3 && NR<=5{print $0}' /etc/passwd #第三行到第五行(包含) awk -F: 'NR==3 || NR==5{print $1,$3}' /etc/passwd #第三行或第五行 awk -F '/正则/{print $1"-"$3}' #第三行第一列和第七列 [root@tencent_cloud test]# awk -F: 'NR==3{print $1,$7}' /etc/passwd daemon /sbin/nologin #第三行到第五行(包含) [root@tencent_cloud test]# awk -F: 'NR>=3 && NR<=5{print $0}' /etc/passwd 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@tencent_cloud test]# awk -F: 'NR==3 || NR==5{print $0}' /etc/passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin #bash结尾的 [root@tencent_cloud test]# awk -F: '/bash$/{print $1,$7}' /etc/passwd root /bin/bash lighthouse /bin/bash mysql /bin/bash baimo /bin/bash [root@tencent_cloud test]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.12.9 netmask 255.255.252.0 broadcast 10.0.15.255 inet6 fe80::5054:ff:fe86:a5f1 prefixlen 64 scopeid 0x20<link> ether 52:54:00:86:a5:f1 txqueuelen 1000 (Ethernet) RX packets 24632239 bytes 34222692429 (31.8 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3648904 bytes 666552359 (635.6 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@tencent_cloud test]# ifconfig eth0 | awk 'NR==2{print $2}' 10.0.12.9 [root@tencent_cloud test]# ip=`ifconfig eth0 | awk 'NR==2{print $2}'` [root@tencent_cloud test]# echo $ip 10.0.12.9 yum install expect -y expect << EOF 需要交互的代码块 expect{ "询问1"{send "操作\r(确认)";exp_continue} "询问2"{send "操作\n(确认)";exp_continue} "询问3"{send "操作\n"} } expect eof EOF [root@www1 scripts]# cat 15.sh #!/bin/bash expect << EOF spawn ssh root@1.1.1.2 hostname expect { "yes/no" {send "yes\r";exp_continue} "*assword" {send "1\n"} } expect eof EOF [root@www1 scripts]# chmod +x 15.sh while read line #line是一个变量给你用 do echo $line>>./b.txt done</etc/passwd #定义的要阅读的文件路径 #写一个脚本可以远程操作100台主机,并完成该密码操作 1、将需要操作的变量存在一个文件中,文件格式如下: root:原密码:新密码:ip root:123:1:192.168.15.100 2、读信息,用awk切出信息 3、使用expect免交互 #!/bin/bash/expect while read line do user=`echo $line | awk -F: '{print $1}'` #user old_pwd=`echo $line | awk -F: '{print $2}'` #old password new_pwd=`echo $line | awk -F: '{print $3}'` #new password ip=`echo $line | awk -F: '{print $4}'` #ip expect << EOF spawn ssh $user@$ip passwd expect { "yes/no" {send "yes\r";exp_continue} "*assword" {send "$old_pwd\n"} } expect { "*assword" {send "$new_pwd\n";exp_continue} "*assword" {send "$new_pwd\n"} } expect eof EOF done</tmp/passwd.txt __EOF__ 本文作者:白 墨 本文链接:https://www.cnblogs.com/zhaokunhao/p/14654788.html 关于博主:评论和私信会在第一时间回复。或者直接私信我。 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! 声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力! 分类: linux入门到永无止境 好文要顶 已关注 收藏该文 BaiM0 关注 - 3 粉丝 - 5 我在关注他 取消关注 00 « 上一篇: 21 shell流程控制 » 下一篇: 05 NFS基础知识 posted @ 2021-04-13 19:01 BaiM0 阅读(74) 评论(0) 编辑 收藏 举报 发表评论 编辑 预览 支持 Markdown 自动补全 退出 订阅评论 我的博客 [Ctrl+Enter快捷键提交] 【推荐】华为开发者专区,与开发者一起构建万物互联的智能世界 【推荐】云资源需求调查,百度智能云准备给园友们发专属优惠福利 【推荐】跨平台组态\工控\仿真\CAD 50万行C++源码全开放免费下载! 【推荐】华为 HMS Core 线上 Codelabs 挑战赛第4期,探索“智”感生活 编辑推荐: · WPF将窗口置于桌面下方(可用于动态桌面) · 微服务1:微服务及其演进史 · .NET内存性能分析指南 · 在腾讯这一年,坚守初心持续单纯 | 2021年终总结 · [WPF] 用 OpacityMask 模仿 UWP 的 Text Shimmer 动画 最新新闻: · 云计算厂商UCloud做“隐私计算”,凭什么?(2021-12-21 18:30) · Meta对网络钓鱼攻击提起诉讼(2021-12-21 18:20) · T-Mobile今年已拦截210亿个诈骗电话,一半以上与车辆保修诈骗有关(2021-12-21 18:10) · 声网Agora 侯云忆:让实时互动成为元宇宙的“空气和水”∣GAIR 2021(2021-12-21 18:00) · 陈皓:我做系统架构的一些原则(2021-12-21 17:52) » 更多新闻... 22 grep、sed、awk三剑客初探 发表于 2021-04-13 19:01阅读:74评论:0推荐:0 LINUX入门到永无止境 This blog has running : 1860 d 11 h 24 m 3 sღゝ◡╹)ノ♡ Copyright © 2021 BaiM0 Powered by .NET 6 on Kubernetes Theme version: v1.3.2 / Loading theme version: v1.3.2
sed 是linux 中,流媒体编辑器
sed :修改文本
sed的格式
sed [参数】 ’处理规则‘ [操作对象]
-e 允许多项编辑 -n 取消默认输出 -i 就地编辑 -r 支持拓展正则 -f 指定sed匹配规则脚本文件
案例
sed 的多项编辑
[root@localhost ~]# vim 4.txt
查看文件
删除第三行 sed '3d' 4.txt
删除第三行六行 sed -e '3d' -e '6d' 4.txt
取消默认输出 -n
就地编辑 -i
支持拓展正则 -r
-f : 指定sed匹配规则脚本文件
定位
1、数字定位法
sed '3d' 4.txt
sed '2,3d' 4.txt2、正则定位法
指定正则定位。
sed '/^g/d' 2.txt
3、数字和正则定位法
从第三行以ig 开头行删除
4、正则正则定位法
sed 的编辑模式
d :删除 p :打印 a : 在当前行后添加一行或多行 sed '2axxx' 4.txt c :用新文本修改(替换)当前行 sed '2cxxx' 4.txt i : 在当前行之前,插入文本(单独使用时) sed '2ixxx' 4.txt r : 在文件中读内容 sed '2r r.txt' 2.txt w : 将指定行写入文件 sed '2w w.txt' 2.txt y : 将字符转换成另一个字符 sed '2y/fa/FA/' 2.txt s : 将字符串转换成另一个字符串(每一行只替换一次) sed 's/11/22/' 6.txt g : 全部执行 sed 's/11/22/g' 6.txt i : 忽略大小写(跟 s 模式一起使用时) & :代表前面匹配到的内容
案例
1、将nginx.conf中的注释行全部去掉
[root@localhost ~]# sed '/^ *#/d' /etc/nginx/nginx.conf
2、将nginx.conf中每一行之前增加注释
[root@localhost ~]# sed 's/.*/# &/g' /etc/nginx/nginx.conf3、要求一键修改本机的ip,
192.168.15.100 ---> 192.168.15.101
172.16.1.100 ---> 172.16.1.101
sed -i 's#.100#.101#g' /etc/sysconfig/network-scripts/ifcfg-eth[01]
4、将/etc/passwd中的root修改成ROOT
sed -i 's#root#ROOT#g' /etc/passwd
awk












浙公网安备 33010602011771号