shell 三剑客 1.0
2022-05-20 13:51:19 1 举报
AI智能生成
shell
作者其他创作
大纲/内容
循环种类
while循环
当型循环, 当满足条件后才循环
do ... until
直到型循环, 一直进行循环到不满足条件
for xxx in XX
通用
if
case
while循环
死循环/有条件循环
while true
do
done
while 表达式
do
done
脚本while读取文件内容(文件中有ip/url)
while read line
do
done <filename
管道
sort 排序
-r : 逆序
-n:根据数字排序
uniq:合并相同且相邻的行)
-c 同时显示次数
生成随机字符
date
date |md5sum
RANDOM
tr
md5sum
变量赋值
直接赋值
oldboy=oldboy.com
引用命令结果
ip=$(hostname -I|awk 'print $1')
通过read交互式
read -p "input url" oldboy
参数传递
脚本/函数参数 传参
三剑客
正则表达式
什么是正则
匹配有规律的东西
regular expression(RE)
使用一些符号来表达重复出现,大小写,开头结尾的含义
应用场景,谁用
linux 三剑客,高级开发语言(python,colang等)
过滤有规律的内容,尤其是日志
正则注意事项
所有的符号英文符号
学习正则,通过grep命令学习。grep加上单引号
给grep, egrep加上颜色 alias grep=''grep --color=auto"
注意系统的字符集:en_US.UTF-8,如果出现问题修改字符集为C export LANG=C
快速掌握正则:配合grep -o 参考学习
规则
正则分类
基础正则(basic BRE)
^ $ ^$ . * .* [a-z] [^abc]
^ :以什么开头
grep "^六" id.txt
$: 以什么结尾
grep "六$" id.txt
^$:
匹配空行
grep "^$" id.txt
用法:
排除空行
grep -rnv "^$" id.txt
. :任意一个字符
点不匹配空行
* :连续出现前一个字符0次及以上
grep "d*" id.txt
会打印出所有,应为是匹配0个d及以上。
.* : 表示所有
[]: 中括号,表示匹配其中一个。
[a-z]:匹配a-z任意一个字符
[^a-z]:匹配a-z意外的任意一个字符:[^]表示取反
转义字符: \
用于转移特殊字符
转义字符序列:
\n
\t
正则是贪婪的,会匹配所有,匹配到最多最全。
扩展正则():使用命令egrep /grep -E: + | () {}
+ :表示前一个字符,连续出现一次及一次以上
固定搭配
[]+
匹配出文件中连续的数字
[0-9]+
匹配出文件中所有单词
[a-z]+
| : 表示或者
[]与|都表示或者。
[]匹配当个字符[0-9]
| 匹配一块(单词): oldboy|oldgirl
(): 表示被括起来的是一个整体,相当于是一个字符
sed的中表示反向引用。
{} :表示前一个字符出现的次数
{n}
出现n次
{n,m}
出现n到m次
{,m}
最多出现m次
{n,}
至少出现n次
?: 表示前一个字符出现0次或者1次
匹配前一个字符总结
*
0次及以上
+
1次及以上
?
0次或1次
{}
指定次数
正则VS通配符
正则
三剑客,高级语言,进行过滤
通配符
匹配文件(文件名)
Linux下面大部分命令都支持
三剑客
三剑客特点及应用场景
grep
过滤
grep命令过滤速度是最快的
sed
替换,修改文件内容,取行
如果要进行替换/修改文件内容,取出某个范围的内容(从早上10到11点的内容)
awk
取列,统计计算
取列,比较(> < = !=), 统计,计算(awk数组)
grep
-E
支持正则
-A,-B ,-C
-A5, 匹配后,多显示后面5行
-B5, 匹配后,多显示前面5行
-C5,匹配后,多显示上下各5行
-c
统计出现的行数
与wc -l的结果一样。
-v
按行取反
ps -ef |grep -c '[c]ount'
查看count进程,排除掉grep命令
-n
显示行号
-i
忽略大小写
-w
精确匹配
精确匹配一个字符串
grep ‘\boldboy\b’ : \b表示边界
grep ‘\<oldboy\>’ : \b表示边界
sed
特点及格式
sed(stream editor)流编辑器,sed把处理的内容(文件),当作水流,源源不断的进行处理,直到文件结尾。
sed命令格式:
sed -r ‘s###g’ id.txt: -r表示可以用扩展正则
sed的核心功能:
s
替换substitute sub
p
显示print
d
删除delete
cai
增加c/a/i
sed命令执行过程
四个字表述
找谁干啥
sed查找 p,固定搭配-n +p
'1p','2p'
指定行号查找
‘$p’ 表示最后一行: 这里的$不是正则表达式的符号
‘1,5p’
指定行号范围查找
‘/oldboy/p’
类似与grep过滤,//里边可以写正则
‘/10:00/,/11:00/p’
表示过滤范围
指定的范围要存在:
前面不存在:匹配无
后面不存在:匹配到最后
‘5,/11:00/p’
混合,显示从第5行到包含11:00的行
sed删除 d
和sed查找用法一致, 把p该为d
删除文件中的空行和包含#号的行
sed -r '/^$|#/d' id.txt
!的妙用
意义,取反
sed -nr '/^$|#/!p' id.txt
sed增加 cai
和sed查找用法一致, 把p该为c a i
c
replace替换,替代这行的内容
a
append追加,向指定的行或每一行追加一行内容(行尾),相当于>>
sed -r '3a oldboy' id.txt: 在第三下面增加一行“oldboy”
i
insert插入,向指定的行或每一行插入一行内容(行首)
案例:向文件中追加配置内容:
cat >>id.txt <<EOF
doc_con="docker exec -it jenkins bash"
#配置OK
EOF
sed -i '$a doc_con="docker exec -it jenkins bash"\n#配置OK' id.txt
sed替换 s
和sed查找用法一致, 把p该为s
替换格式
s###g
s@@@g
s///g
删除行中某些字符
sed -r 's/[0-3]//g' id.txt
s###g: 中的g
表示全局的匹配,表示匹配行中所有的内容。不加g,默认匹配每行的第一个。
反向引用()
口诀:先保护,再使用
用途
把匹配内容分块(分组),进行保护
使用的时候按块序号输出 \1 , \2
echo 123456 |sed -r 's#(.*)#<\1>#g' :\1表示()中的内容。
输出结果<123456>
echo oldboy_lidao |sed -r 's#(^.*)_(.*$)#\2_\1#g'
输出结果:lidao_oldboy
案例:过滤出某张网卡的ip地址
ip a s docker0 |sed -n '3p' |sed -r 's#(^.*t )(.*)(/.*$)#\2#g'
ip a s docker0 |sed -nr '3s#(^.*t )(.*)(/.*$)#\2#g'
过滤出最后的访问时间: stat /etc/hosts |sed -n 5p|sed -r 's#(^.*:\ )(.*)(\ \+.*$)#\2#g'
运用三剑客,不忙着用,先看看命令本身是否支持?
awk
特点与应用场景
一们语言,类似与c语言
过滤,统计,计算
过滤,统计计算
口诀:找谁{干啥}
条件{命令}
awk的环境变量
NR
Number of Record: 记录号,行号
awk -F: 'NR==1{print $1,$NF}' /etc/passwd |column -t
NF
Number of Field: 每行有多少个字段(列),$NF表示最后一列
awk -F: '{print $1,$NF}' /etc/passwd |column -t
FS
-F:等同于 -v FS=: ;Filed Separator字段分割符,每个字段结束标记。
awk -v FS=: -v OFS=: '{print $1,$NF}' /etc/passwd |column -t
OFS
output filed Separator 输出字段分割符(awk显示每列的时候,每列之间添加什么分割符,默认是空格)
awk -v FS=: -v OFS=: '{print $1,$NF}' /etc/passwd |column -t
-F 强大的分割模式
ip a s eno1 |awk -F"[ |/]+" 'NR==4 {print $3}'
-F 可以用正则制定分割符。
可以多个符号作为分割符号
awk的行与列
行: 叫做记录 record
每行默认通过回车分割的
列:叫做字段,域, field
每列默认通过空格分割的
行和列的默认分割符都是可以修改的。
取行取列(找谁)(条件)
取行(找谁1)
NR==1
取出第一行
NR>=1&&NR<=5
取出1到5行
符号:
> < >= <= == !=
/101/,/106/
过滤和sed的类似(支持正则)
awk -F'[ "]+' '/revision/' full.xml
取某一列中(不)包含某一规则的行(可以用正则,默认支持扩展正则)
~:表示包含
awk -F: '$3~/^3/' /etc/passwd
匹配第三列中以3开头的行
!~ :表示不包含
awk -F: '$3!~/^1/' /etc/passwd
匹配第三列中不以1开头的行
特殊模式:
BEGIN{}
里面的内容在awk读取文件之前执行
1.进行简单的统计,计算,不设计读取文件
2.用来处于文件之前,添加加表头
3.用来定义awk变量(很少用,因为可以-v)
END{}
里面的内容在awk读取文件之后执行
1.awk进行统计, 一般过程:先进行计算,最后END里边输出结果。
2.awk使用数组,用来输出数组结果。
取列(找谁2)
分割符:-F
取出某一列:{$数字}
$0 表示所有列,需要包含在{}中
NF
表示有多少列
$NF 表示最后一列
column -t :列对其(格式化)
案例:取出第一列和最后一列
awk -F: '{print $1,$NF}' /etc/passwd |column -t
分割符的添加
awk数组(核心)
功能要点
统计日志
统计每个ip出现的次数,统计系统中每个用户被攻击的次数
累加求和
统计每个ip消耗的流量
数组基础
shell
赋值: array[0]=oldboy,array[1]=lidao
使用:echo ${array[0]} ${array[1]}
整个数组${array[*]}
for i in ${array[*]}
for i in ${array[*]}
do
echo $i
done
awk
赋值: array[0]=“oldboy”,array[1]=“lidao”,array[2]=12306
注意,手动赋值的时候会第一识别变量,所以字符串需要添加“”:array[0]="oldboy"
使用: print array[1] array[2]
整个数组:array
for(i in array)
for(i in array)
print array[i]
i表示array数组的下标;
array[i]表示:下标为i的数组成员内容
数组的创建
array[]++
awk的统计方法
i=i+1
i++
技术,统计
sum=sum+???
sum+=???
求和,累加
array[]=array[]+1
array[]++
数组分类计数
[]中可以填入列号,表示统计该列。
awk -F"[/.]+" '{array[$2]++}END{for(i in array) print i,array[i] }' ip.txt |sort -rnk2
awk中的循环判断
for 循环(数字) 对比
shell for循环(c的形式)
for((i=0;i<10;i++))
do
echo $i
done
awk for循环(用于字段)
for(i=0;i<1;i++)
print i
awk 的for循环用来循环每个字段
if 判断
shell
if [ ${oldboy} -eq 18 ];then
echo "take"
else
echo "no"
fi
awk
if(条件)
print “take”
else
print "no"
案例分析:
题目:过滤出这个字符串中的单词数,每个单词的字母数:“I am oldboy teacher welecome to oldboy training class”
实现命令
echo "I am oldboy teacher welecome to oldboy training class" |awk '{for(i=1;i<=NF;i++) if(length($i)<6) print $i}'
0 条评论
下一页