shell脚本grep指令sed指令awk指令

shell脚本grep指令sed指令awk指令 面试题grep、sed、awk有何区别grep用于查找特定内容适合快速过滤日志或配置文件。sed用于修改和编辑文本非常适合批量替换或删除操作。awk更强大适用于列状数据的处理能够提取字段、统计数据或进行数学计算。在运维工作中我会根据不同的需求选择合适的工具当需要简单查找时用 grep批量修改文件时用 sed处理复杂的日志或统计数据时使用 awk。grepgrep主要作用过滤来自一个文件或标准输入匹配模式内容。除了 grep 外还有 egrep。egrep 是 grep 的扩展相当于 grep -E。基本语法grep [OPTION]... PATTERN [FILE]...支持的正则描述-E,--extended-regexp模式是扩展正则表达式(ERE) 字符簇、()、|或-P,--perl-regexp模式是Perl正则表达式 \d、\w、\s-i,--ignore-case忽略大小写-w,--word-regexp模式匹配整个单词--- 精准匹配单词-v--invert-match打印不匹配的行 传说中的取反输出控制描述-n,--line-number打印行号-h,--no-filename不输出文件名-o,--only-matching只打印匹配的内容-r,--recursive递归目录-c,--count统计匹配行数sedsed 流编辑器Stream Editor核心作用批量修改、替换、删除、截取文本主打行级文本编辑不用打开文件命令行直接处理sed [选项] 操作 文件名 # 或 管道用法 命令 | sed 操作-n只输出匹配 / 处理过的行默认打印所有行-i直接修改原文件谨慎使用-e执行多个编辑指令替换 s/旧/新/s/原字符串/新字符串/# 把每行第一个 a 换成 b sed s/a/b/ test.txt # 全局替换整行所有 a 都换加 g sed s/a/b/g test.txt # 带 / 路径替换改用 # 当分隔符避免冲突 sed s#/usr#/home#g test.txt打印指定行搭配 -n# 只打印第 3 行 sed -n 3p test.txt # 打印 2~5 行 sed -n 2,5p test.txt # 匹配包含 root 的行并打印 sed -n /root/p test.txt删除行d delete不加 -i 只预览加 -i 才真删文件# 删除第 2 行 sed 2d test.txt # 删除空行 sed /^$/d test.txt # 删除包含 # 注释的行 sed /#/d test.txt插入 / 追加文本i行前插入a行后追加# 在第 1 行前面加内容 sed 1i 开头文字 test.txt # 在最后一行后面加内容 sed $a 结尾文字 test.txt # 全局替换并直接改原文件 sed -i s/old/new/g test.txtawkawk [选项] 模式{动作} 文件名常见选项NR Number of Record 当前处理的行号常见选项NF Number of Field 当前行的字段总数$0当前行的整行内容$1 $2 ...当前行的第 1、第 2… 个字段# 打印第3行的所有字段数 awk NR3{print NF} test.txt # 打印第1行和第5行 awk NR1 || NR5 test.txt # 打印所有行号大于2的行 awk NR2 test.txt#需求:取出用户名和他的登录shellawk -F: {print $1,$NF} /etc/passwd-F:指定分隔符为冒号:/etc/passwd里的每一行都是用冒号分隔字段的。{print $1,$NF}$1代表每行的第 1 个字段用户名$NF代表每行的最后一个字段用户的默认 shell/etc/passwd要处理的文件路径。需求:取出整行内容并显示行号awk {print NR,$0} /etc/passwdawk记录行NR 全称是Number of Record中文叫 “记录号 / 行号”#取 ifconfig ens160 的输出交给 awk 处理当读到第 2 行时打印这一行的第 2 个字段通常就是网卡的 IP 地址 ifconfig ens160 | awk NR2{print $2}NRawk 处理文本时每读一行NR的值就会 1所以它代表当前正在处理的行号。NR2是一个条件判断模式意思是 “当行号等于第 2 行的时候”。{print $2}是满足条件时执行的动作打印这一行的第 2 个字段。awk模式与动作进阶awk $0~/正则表达式/以冒号为分隔符截取/etc/passwd 里第五列用户注释信息是否包含字符串shutdownawk -F: $5~/shutdown/ /etc/passwd例子1有一个文档里面显示如下练习显示姓Zhang的人的第二次捐款金额及她的名字awk -F[ :] $1~/^Zhang/{print $1$2,$(NF-1)} awk.txt练习显示Xiaoyu的名字和ID号码并以逗号隔开awk -F[ :] $2~/^Xiaoyu/{print $2,$3} awk.txt练习显示所有以41开头的ID号码的人的全名和ID号码awk -F[ :] $3~/^41/{print $1$2$3} awk.txt练习取出网卡ens33/ens160的ip地址ifconfig ens160 |sed -n 2p |awk -F[ ] {print $3}练习取出常用服务端口号 思路 linux下面服务与端口信息的对应表格在/etc/services里面所以这道题要处理/etc/services文件awk -F[ /] $1~/^(ssh|https|ftp|rsync)$/{print $1,$2} /etc/services|sort|uniq -c|sort -nrBEGIN模式和END模式BEGIN设置表头awk BEGIN{print username,UID}{print $1:$3} awk.txt给变量赋值方便后续做运算echo |awk BEGIN{a10}{print a}awk BEGIN{a10;print a}awk BEGIN{a10;print a}只有BEGIN块所以只会执行一次①a10给变量赋初始值②print a直接打印这个值结果就是输出10这里变量的作用是临时保存一个值供当前步骤使用。echo | awk BEGIN{a10}{print a}执行流程分两步① 先执行BEGIN{a10}初始化变量a为10只执行 1 次② 再执行{print a}因为echo给了 1 行输入所以主处理块会执行 1 次打印a的值10这里变量a的值从BEGIN块传递到了后续的主处理块里。END自动初始化awk 中未初始化的数字变量默认值为0所以i一开始就是0。计数逻辑每遇到一个空行i就会让i加 1记录空行的数量。结果输出END块在所有行处理完后执行此时i的值就是最终的空行总数awk支持数学运算查看cpu的使用率top -bn1 | awk -F[ ,] NR3{print $8}第3行第8列以多个空格逗号分隔计算1-100的和seq 100 100.txt$0整行内容代表当前处理的一整行数据不管这一行有多少字段$0都是完整的一行$1第 1 个字段代表当前行按分隔符切分后的第一个字段默认分隔符是空格 / 制表符