linux中shell编程 -->三剑客习题汇总

1、找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写
[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开头的信息
[root@localhost ~]# grep -rE '^(root|centos|user)' /etc/

解析:
-rE	: 扩展正则递归查询
-rE ^(root|centos|user)	: 递归查找以下root或centos或user开头的行
3、找出/etc/init.d/functions文件下包含小括号的行
[root@localhost ~]# grep -E '\(|\)' /etc/init.d/functions 

解析:
-E		:  扩展正则
\  		:  取消转义
'(|)'	:  左括号或者右括号
总结:
	取文件内的左括号或右括号
4、输出指定目录的基名
[root@localhost /etc/sysconfig]# pwd | awk -F/ '{print $NF}'

输出结果:
root
5、找出网卡信息中包含的数字
[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下每种解析器的用户个数
示例:
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,用三种方式实现
[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函数出现的次数
[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中注释的行和空行
下载php.ini
[root@localhost ~]# yum install php php-devel
[root@localhost ~]# grep -vE '^\ *;|^$' /etc/php.ini 

解析:
-v		: 反向过滤
'^\ *;'	 : 以多个空格;开头的   取消空格转义
'|'		: 或
^$		: 空行
10、找出文件中至少有一个空格的行
[root@localhost ~]# grep -E '\ +' /etc/php.ini

解析:
+	: 一个或多个空格
11、过滤文件中以#开头的行,后面至少有一个空格
[root@localhost ~]# grep -E '^#\ +' /etc/fstab 

解析:
'^#\ +'		: 以#号开头的行后面有至少一个或多个空格
12、查询出/etc目录中包含多少个root
[root@localhost ~]# grep -roE 'root' /etc/ | wc -l

解析:
r		: 递归匹配
o		: 只显示匹配成功的内容
E		: 使用扩展正则
|		: 管道符
wc		: 匹配行数
l		: 打印匹配的行数
13、查询出所有的qq邮箱
[root@localhost ~]# grep -E '[0-9a-zA-Z-_]+@qq\.com'
14、查询系统日志中所有的error
[root@localhost ~]# grep -E 'error' /var/log/messages

解析:
Linux中系统调用的错误都存储于 errno中,errno由操作系统维护,存储就近发生的错误,即下一次的错误码会覆盖掉上一次的错误。​
15、删除某文件中以s开头的行的最后一个词
[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、删除一个文件中的所有数学
[root@localhost ~]# sed -r 's/[0-9]//g' 11.txt 

解析:
-r			: 支持扩展正则
s/[0-9]//g	: 全部替换文本中的数字替换成空
17、显示奇数行
[root@localhost ~]# awk -F: 'NR%2==1{print $0}' /etc/passwd

解析:
-F:		:指定:分隔符
NR%2==1	: 求文本行号除2 余数得1的
$0		: 打印所有符合条件的行
18、删除passwd文件中以bin开头的行到nobody开头的行
[root@localhost ~]# sed -r '/^bin/,/^nobody/d' /etc/passwd

解析:
	指定开头一个正则,后面开头一个正则
	d	: 删除
	删除以g开头的行到以j结尾的行结束
19、从指定行开始,每隔两行显示一次空行
[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行打印一个空行
[root@localhost ~]# awk -F: '{if(NR%5==0){print " "}; print $0}' /etc/passwd

解析:
NR%5==0		: 判断当前行号除以5 求余数 是否等于0
21、不显示指定字符的行
[root@localhost ~]# grep -vE 'g' 2.txt 

解析:
-v		: 取反 过滤
22、将文件中1到5行中aaa替换成AAA
[root@localhost ~]# sed -r '1,5s/aaa/AAA/g' 13.txt

解析:	
1,5s	:将第一行至第五行替换
23、显示用户id为奇数的行
[root@localhost ~]# awk -F: '$3%2==1{print $0}' /etc/passwd

解析:
$3		: passwd内 第三列 属主列
$3%2==1{print $0}	 : 第三列除以2余数 得1的打印
24、显示系统普通用户,并打印系统用户名和id
[root@localhost ~]# awk -F: '$3>=1000{print $1, $3}' /etc/passwd

解析:
普通用户id默认大于1000
系统用户id默认小于1000

判断普通用户的id是否大于1000《大于情况下,打印系统用户    小于情况不打印》
25、统计nginx日志中独立用户数(ip维度计算)
[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中每个词的个数
[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
#!/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访问的峰值,按每个小时计算
#!/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
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' /var/log/nginx/access.log | sort | uniq -c | sort -r | head
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值