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