linux中shell编程 -->三剑客习题汇总
目录
- 1、找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写
- 2、显示当前系统上的以root,centos或者user开头的信息
- 3、找出/etc/init.d/functions文件下包含小括号的行
- 4、输出指定目录的基名
- 5、找出网卡信息中包含的数字
- 6、找出/etc/passwd下每种解析器的用户个数
- 7、获取网卡中的ip,用三种方式实现
- 8、搜索/etc目录下,所有的.html或.php文件中main函数出现的次数
- 9、过滤掉php.ini中注释的行和空行
- 10、找出文件中至少有一个空格的行
- 11、过滤文件中以#开头的行,后面至少有一个空格
- 12、查询出/etc目录中包含多少个root
- 13、查询出所有的qq邮箱
- 14、查询系统日志中所有的error
- 15、删除某文件中以s开头的行的最后一个词
- 16、删除一个文件中的所有数学
- 17、显示奇数行
- 18、删除passwd文件中以bin开头的行到nobody开头的行
- 19、从指定行开始,每隔两行显示一次空行
- 20、每隔5行打印一个空行
- 21、不显示指定字符的行
- 22、将文件中1到5行中aaa替换成AAA
- 23、显示用户id为奇数的行
- 24、显示系统普通用户,并打印系统用户名和id
- 25、统计nginx日志中独立用户数(ip维度计算)
- 26、统计php.ini中每个词的个数
- 27、统计1分钟内访问nginx次数超过10次的ip
- 28、找出nginx访问的峰值,按每个小时计算
- 30、统计访问nginx前10的ip
1、找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写
copy[root@localhost ~]# grep -E '^[sS]' /proc/meminfo [root@localhost ~]# sed -r -n '/^[sS]/p' /proc/meminfo [root@localhost ~]# awk '/^[sS]/{print $0}' /proc/meminfo [root@localhost ~]# grep -iE '^s' /proc/meminfo 解析: 案例1:(过滤文本) grep -E '^[sS]' /proc/meminfo -E : 扩展正则 ^[sS] : 以s开头 忽略大小写 grep没有定义 只有过滤 案例2:(修改文件) sed -r -n '/^[sS]/p' /proc/meminfo -r -n : 支持扩展正则 取消静默输出 sed 使用正则 有定义 案例3:(处理文件) awk '/^[sS]/{print $0}' /proc/meminfo ^[sS]/{print $0} : 以s忽略大小写开头的行打印
2、显示当前系统上的以root,centos或者user开头的信息
copy[root@localhost ~]# grep -rE '^(root|centos|user)' /etc/ 解析: -rE : 扩展正则递归查询 -rE ^(root|centos|user) : 递归查找以下root或centos或user开头的行
3、找出/etc/init.d/functions文件下包含小括号的行
copy[root@localhost ~]# grep -E '\(|\)' /etc/init.d/functions 解析: -E : 扩展正则 \ : 取消转义 '(|)' : 左括号或者右括号 总结: 取文件内的左括号或右括号
4、输出指定目录的基名
copy[root@localhost /etc/sysconfig]# pwd | awk -F/ '{print $NF}' 输出结果: root
5、找出网卡信息中包含的数字
copy[root@localhost /etc/sysconfig]# grep -oE '[0-9]+' /etc/sysconfig/network-scripts/ifcfg-ens3[23] 注: 根据各自网卡ip 子网 填写地址 查看IP: 解析: -oE : 只显示匹配成功的内容 [0-9]+ :数字0-9匹配至少一个或多个
6、找出/etc/passwd下每种解析器的用户个数
copy示例: arr = {"bash": 10, "sh": 9, "zsh": 1} [root@localhost /etc/sysconfig]# awk -F: '{arr[$NF]++}END{for(i in arr){print i,arr[i]}}' /etc/passwd 解析: arr : 属组 k 解析器在属组内 $NF : k arr[$NF] : 取字典v arr[$NF]++ :取字典v v+=1 for(i in arr) : i循环取字典里面的值 arr = {"bash": 10, "sh": 9, "zsh": 1} for i in arr: print(i, arr[i]) bash 10 sh 9 zsh 1
7、获取网卡中的ip,用三种方式实现
copy[root@localhost /etc/sysconfig]# ip a | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' [root@localhost /etc/sysconfig]# ip a | sed -r -n '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' [root@localhost /etc/sysconfig]# ip a | awk '/([0-9]{1,3}\.){3}[0-9]{1,3}/{if(NR==3){print $2}else{print $2,$4}}' 案例1 解析: -oE : 只显示匹配成功的内容 扩展正则 | :管道符 案例2 解析: -r -n : 扩展正则 取消默认输出 // : 正则 p :打印 案例3 解析: ip a | : 管道符 前面一个命令的结果交给后面一个命令处理 // : 匹配正则 [0-9] : 数字0-9 {1,3} : 至少1个 最多3个 \. : 取消转义 {3} : 执行3次‘ NR==3 : 行号等于3 $2 : 第二列 $2,$4 : 第二列和第四列
8、搜索/etc目录下,所有的.html或.php文件中main函数出现的次数
copy[root@localhost ~]# grep -rE 'main' `find /etc/ -name "*.html" -o -name "*.php" | xargs ` | wc -l 解析: -rE : 递归匹配 扩展正则 `` : 提前运行 find : 指定目录下查找文件 /etc/ : 查找路径 -name : 按照文件的名字查找文件 * : 通配符 是匹配任意个数的任意字符,和正则里*不同的是 通配符一般只用作匹配文件的名称mv cp find等等中使用 '.html' : 查找名称 -o : 或者 | : 前面一个命令的结果交给后面一个命令处理 xargs : 把处理的文件变成以空格分割的一行 wc -l : 统计文件的行数
9、过滤掉php.ini中注释的行和空行
copy下载php.ini [root@localhost ~]# yum install php php-devel [root@localhost ~]# grep -vE '^\ *;|^$' /etc/php.ini 解析: -v : 反向过滤 '^\ *;' : 以多个空格;开头的 取消空格转义 '|' : 或 ^$ : 空行
10、找出文件中至少有一个空格的行
copy[root@localhost ~]# grep -E '\ +' /etc/php.ini 解析: + : 一个或多个空格
11、过滤文件中以#开头的行,后面至少有一个空格
copy[root@localhost ~]# grep -E '^#\ +' /etc/fstab 解析: '^#\ +' : 以#号开头的行后面有至少一个或多个空格
12、查询出/etc目录中包含多少个root
copy[root@localhost ~]# grep -roE 'root' /etc/ | wc -l 解析: r : 递归匹配 o : 只显示匹配成功的内容 E : 使用扩展正则 | : 管道符 wc : 匹配行数 l : 打印匹配的行数
13、查询出所有的qq邮箱
copy[root@localhost ~]# grep -E '[0-9a-zA-Z-_]+@qq\.com'
14、查询系统日志中所有的error
copy[root@localhost ~]# grep -E 'error' /var/log/messages 解析: Linux中系统调用的错误都存储于 errno中,errno由操作系统维护,存储就近发生的错误,即下一次的错误码会覆盖掉上一次的错误。
15、删除某文件中以s开头的行的最后一个词
copy[root@localhost ~]# grep -Ei '^s' 11.txt | grep -oE '[0-9a-zA-Z]+' | xargs | awk '{for(i=0;i<(NF-1);i++){print $i}}'
16、删除一个文件中的所有数学
copy[root@localhost ~]# sed -r 's/[0-9]//g' 11.txt 解析: -r : 支持扩展正则 s/[0-9]//g : 全部替换文本中的数字替换成空
17、显示奇数行
copy[root@localhost ~]# awk -F: 'NR%2==1{print $0}' /etc/passwd 解析: -F: :指定:分隔符 NR%2==1 : 求文本行号除2 余数得1的 $0 : 打印所有符合条件的行
18、删除passwd文件中以bin开头的行到nobody开头的行
copy[root@localhost ~]# sed -r '/^bin/,/^nobody/d' /etc/passwd 解析: 指定开头一个正则,后面开头一个正则 d : 删除 删除以g开头的行到以j结尾的行结束
19、从指定行开始,每隔两行显示一次空行
copy[root@localhost ~]# awk -F: '{n=5;if(NR<n){print $0}else{if((NR-5)%2==0){print "---"};print $0}}' /etc/passwd 解析: n=5 : 定义 if(NR<N){print $0} : 判断文本行号是否小于5 小于五打印一行 else{if((NR-5)%2==0){print "--"};print $0} : 文本行号不小于5,进入else,判断当前行号减5等的数除以2 求余数 如果余数得0打印 "--" 余数不得0 打印$0(一行打印在进行判断) {} : 循环体 $0 : 文本已赋值给$0
20、每隔5行打印一个空行
copy[root@localhost ~]# awk -F: '{if(NR%5==0){print " "}; print $0}' /etc/passwd 解析: NR%5==0 : 判断当前行号除以5 求余数 是否等于0
21、不显示指定字符的行
copy[root@localhost ~]# grep -vE 'g' 2.txt 解析: -v : 取反 过滤
22、将文件中1到5行中aaa替换成AAA
copy[root@localhost ~]# sed -r '1,5s/aaa/AAA/g' 13.txt 解析: 1,5s :将第一行至第五行替换
23、显示用户id为奇数的行
copy[root@localhost ~]# awk -F: '$3%2==1{print $0}' /etc/passwd 解析: $3 : passwd内 第三列 属主列 $3%2==1{print $0} : 第三列除以2余数 得1的打印
24、显示系统普通用户,并打印系统用户名和id
copy[root@localhost ~]# awk -F: '$3>=1000{print $1, $3}' /etc/passwd 解析: 普通用户id默认大于1000 系统用户id默认小于1000 判断普通用户的id是否大于1000《大于情况下,打印系统用户 小于情况不打印》
25、统计nginx日志中独立用户数(ip维度计算)
copy[root@localhost ~]# awk '/([0-9]{1,3}\.){3}[0-9]{1,3}/{arr[$1]++}END{for(i in arr){print i}}' access.log 解析: 195.54.160.149 获得独立ip arr 属组 $1 相当于IP arr = {$1:ip号} : 属组 = k: v arr[$1]++ : 取ip+=1 数量 for i in arr: print(i) : 循环打印内容
26、统计php.ini中每个词的个数
copy[root@localhost ~]# grep -oE '[0-9a-zA-Z]+' /etc/php.ini | awk '{arr[$1]++}END{for(i in arr){printf "%-15s | %-5d\n", i, arr[i]}}' 解析: o : 只显示匹配成功的内容 参数 [0-9a-zA-Z]+ : 匹配至少一个前导字符 /etc/php.ini : 操作对象 | : 管道符 arr : 属组 arr[$1] : 取v arr[$1]++ : 取v v+=1 for i in arr : 将字典赋值i printf : 格式化打印 %s :字符串 %d :数字 - :左对齐 15 : 至少占用15字段 5 : 至少占用5字段 "%-15s | %-5d\n" : 字符串左对齐占用15字段 分隔符 数字左对齐占用5字段 i, arr[i] : i相当于k arr字典 arr[i]取v python案例解析: arr = {"separately":10, "hash":1} for i in arr: print(i,arr[i])
27、统计1分钟内访问nginx次数超过10次的ip
copy#!/bin/bash NGINX_LOG=/var/log/nginx/access.log TIME=`date +%s` DATE=`echo $TIME - 3600 | bc` declare -A IP while read line do timestamp=`echo $line | grep -oE '[0-9]{4}.*T[0-9]{2}:[0-9]{2}:[0-9]{2}'` timestamp=`date -d "$timestamp" +%s` if (( $TIME >= $timestamp && $DATE <= $timestamp ));then ip=`echo $line| grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'` number=`echo ${IP["$ip"]} | wc -L` [ $number -eq 0 ] && IP["$ip"]=0 num=${IP["$ip"]} IP["$ip"]=`echo "$num + 1" | bc` fi done < $NGINX_LOG for i in ${!IP[*]} do if (( ${IP[$i]} >= 10 ));then echo $i fi done
28、找出nginx访问的峰值,按每个小时计算
copy#!/bin/bash NGINX_LOG=/var/log/nginx/access.log declare -A IP while read line do timestamp=`echo $line | grep -oE '[0-9]{4}.*T[0-9]{2}:[0-9]{2}:[0-9]{2}'` timestamp=`date -d "$timestamp" +%Y%m%d%H` number=`echo ${IP["$timestamp"]} | wc -L` [ $number -eq 0 ] && IP["$timestamp"]=0 num=${IP["$timestamp"]} IP["$timestamp"]=`echo "$num + 1" | bc` done < $NGINX_LOG for i in ${!IP[*]} do if (( ${IP[$i]} >= 10 ));then echo "$i ${IP[$i]}" fi done
30、统计访问nginx前10的ip
copygrep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' /var/log/nginx/access.log | sort | uniq -c | sort -r | head
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步