目录
- 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开头的行,至少用三种方式忽略大小写
[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