Linux与Shell grep sed awk

Menu:Linux三剑客与管道使用 41page

#! /bin/bash
echo "hello"

运行脚本俩种方式

1.  chmod +x test.sh      #加权限
    ./test.sh
2.  /bin/sh test.sh

正则表达式

\bhi\b   完全匹配文本hi,只有文本内容为hi的单词才会被匹配,也就是说文本内容中间有空格才可以匹配 \b匹配单词的开始或结束

练习:

匹配以字母a开头的单词  \ba\w*\b    #这里只能用\w*   不能使用.*  因为.*包含了空格和其他的特殊字符,会影响题目   

匹配刚好六个字符的单词  \b\w{6}\b  #单词必须用\b\b包起来

匹配1个或更多连续数字   \d+        #+重复一次或多次

5位到12位qq号           ^\d{5,12}$   #^匹配字符串的开始  $匹配字符串的结束  防止出现开始或结束为字符的数据  

Liunx终端操作:
一、grep #基于正则表达式查找满足条件的行 查找
二、sed #数据修改
Z向下翻页 K向上翻页 查找使用/需要查找内容,然后按Enter键确认
#一般使用man命令查看文件或者查看文件的时候,需要查找、翻页使用上面的快捷键
sed 流处理,对文件进行了修改,原文件不会改变

sed '2a newline' test.txt   #第二行后添加新的一行,内容为newline
sed '2i newline' test.txt   #第二行前添加新的一行,内容为newline

sed -e 's/root/hello/g' test.txt    #-e不会修改原文件  g参数修改全局的内容  s参数为取代
sed -i 's/root/hello/g' test.txt    #-i会修改原文件,一定要谨慎操作  将文件test.txt里面所有为root的内容修改为hello
											   #将root字符修改为hello

三、awk #根据定位到的数据行处理其中的分段 数据切片 默认以空格进行分割切片
$0 展示当前未切片前的所有内容 $1、$2… 就是$0下面的切片 数据默认是以/n分隔符分隔的

Menu:linux常用命令 15page

1.删除文件夹 rmdir temp     #删除文件夹名称为temp的文件夹
2.权限 
	r 读权限 4 
	w 写权限 2
	x 可执行 1
chmod 777 test   #修改文件为可读可写可执行,第一个7代表所有者,第二个7代表所属组,第三个7代表所有人
3.ls -l   #查看文件属性
  ls -ld  test.txt #查看指定文件test.txt的文件属性


#网络
4.ping       #测试网络连接情况
  -c         #ping的次数        
  	ping -c 5 baidu.com    #ping baidu.com五次后结束
  -l         #每次ping的时间间隔
  
5.netstat    #打印Linux网络系统的状态信息
  -t         #列出所有tcp
  -u         #列出所有udp
  -l         #只显示监听端口
  -n         #以数字形式显示地址和端口号
  -p         #显示进程的pid和名字
  
#性能
6.top        #持续监测系统性能   实时变化

7.ps         #查看进程信息    快照
   aux       #显示所有进程,包括用户,分组情况  是用BSD的格式来显示
  -ef        # 是用标准的格式显示进程的

Menu:Bash编程语法 23page
1.变量命名规则

2.变量定义与使用变量
a=10; echo $a   #定义变量a,使用echo打印变量
#变量名=变量值 , 注意=左右不能有空格,使用$变量名调用变量

3.只读变量
a = "123" ; readonly  a  #定义a为只读变量

4.删除变量
unset a                  #删除变量a  如果变量是只读变量,则不可以进行删除

5.变量的作用范围:当前窗口,如果关闭窗口,变量的作用范围就消失了

6.条件分支:if
if [ 2 == 2 ]; then echo "true"; else echo "flase"; fi     #if...then 条件语句   fi为结束    特别需要注意条件 if [ 2 == 2]  中间的空格
if [[ 2 > 1 ]]; then echo "true"; else echo "flase"; fi    #如果条件不是等于,而是大于或小于,则需要使用俩个中括号

如果上述的情况只想用一个中括号,可以使用下面进行代替
-eq 表示相等  
-lt 表示小于
-gt 表示大于

a=10; b=10; if [ $a -eq $b ];then echo "equal"; elif [ $a -lt $b ];then echo "small";elif [ $a -gt $b ];then echo "big"; fi    #[ $a -lt $b ] 表达式和中括号一定要有空格,不然会报错

7.循环:for
for i in $(cat test.txt);do echo $i;done       #循环读取文件内容并输出,done表示结束 ,注意读取文件结束使用为done,非fi

8.while定义
while read i;do echo $i;done<test.txt          #一行一行读,done<test.txt从test.txt去读

Menu:Bash脚本编写 13page

1.`expr $a + $b`      #语法有严格要求,注意空格 `这个不是单引号,而是数字键盘左边的键

a=10; b=20
echo `expr $a + $b`   
echo `expr $a - $b` 
echo `expr $a \* $b`    #乘法要进行转义
echo `expr $a / $b` 
echo `expr $a % $b` 


2.read命令            #参数值的传入  #此处无法运行,todo
read a ; 123
echo $a      #此时a的值为123

3.ps aux | awk '{print $3}' #取出快照第三列的内容
取出结果为:
PGID
1461
2120
1460

ps aux | awk '{print $3}' | grep -v PGID   #-v表示取反,就是不取PGID
取出结果为:
1461
2120
1460

Menu:Linux进阶命令 11page

==========================================
apt-get: command not found,这个的出现是因为系统的原因。

Linux系统分为两种:
1.RedHat系列:Redhat、Centos、Fedora等

2.Debian系列:Debian、Ubuntu等

RedHat系列的包管理工具是yum

Debian系列的包管理工具是apt-get
==========================================

1.curl命令      #支持HTTP/HTTPS/FTP/FTPS协议  安装,可以通过官网。linux 安装可以通过apt-get install jq 命令进行安装
  -x            #指定代理端口,配合代理工具实现代理
curl -x 127.0.0.1:8888 https://www.baidu.com
  -G            #使用get请求 ,不指定参数时,默认访问的也是get请求
  -X GET        #也可以指定是get请求
  -d            #指定post请求体,指定请求为post请求
curl -d 'login=1234' https://www.baidu.com 
  -X POST       #也可以指定是post请求
curl -X POST https://www.baidu.com   
  -o            #保存响应内容
curl -o tmp.html https://www.baidu.com    #将响应内容保存到tmp.html文件中
  -v            #输出通信的整个过程
  -s            #不输出错误和进度信息 静默模式
  
Charles工具,指定代理端口,抓取设置的端口请求来进行分析,使用curl命令的请求时也要指定代理端口喔

2.jq #提取json的工具,官方网站stedolan.github.io/jq/

echo '{"a":11,"b":12}' | jq '.'     #格式进行美化,缩进,高亮

jq内容提取
echo '{"foo":11,"bar":"good job"}' | jq.foo   #提取json里面foo字段

从数组提取提取单个数据
echo '{"a":1,"b":2},{"c":3,"d":4}' | jq.[0]   #提取第一组数据
从数组提取提取所有数据
echo '{"a":1,"b":2},{"c":3,"d":4}' | jq.[]
过滤多个值
echo '{"a":1,"b":2},{"c":3,"d":4},{"e":5,"f":6}' | jq.[0,1] #只提取第一组和第二组的值
数据重组为数组
echo '{"a":1,"b":2},{"c":3,"d":4}' | jq '[.a,.b]'    #输出结果为数组    重组区别于提取,提取时都是jq .    
数据重组为对象
echo '{"a":1,"b":2},{"c":3,"d":4}' | jq '{"tmp":.b}' #输出结果就为字典啦

Menu:三剑客实战Nginx日志分析 bash教程

1.连接shell ,windows使用gitbash或者xshell  连接账号:21139910@shell.testing-studio.com  密码:hogwarts
ssh 21139910@shell.testing-studio.com  #进行连接,输入密码进行连接

w   #命令可以查看在线用户
w | wc -l  #查看在线用户数

推荐配置为2核4G服务器   阿里云、腾讯云、华为云  海外:DigitalOccean、Linode
Linux:国内建议使用CentOS ,国外使用Ubuntu

2.       >file   #将输出重定向到另一个文件
         >>      #表示追加
         <file   #输入重定向
   
3.https://ceshiren.com/t/topic/3321  正则相关得记住,扩展正则表达式也得记住, -E 开启扩展正则表达式
echo 123 | grep -E "1|3"   #grep通过-E参数开启扩展正则表达式

echo 123 | sed -E -e "s#1|3#x#g"  #sed 通过-E -e 参数开启扩展正则表达式

echo 123 | awk '/4 | 3/'          #awk直接开启扩展正则表达式


使用shell命令建议工具使用vscode ,然后选择vscode插件shell-format,可以对shell语句进行格式化,文件内右键选择format docunment

4.less 查看文件内容,大文件也可以打开,使用的是流式加载 键入q就可以退出交互浏览模式

演练文件
cp /tmp/nginx.log ~/nginx.log
使用less命令替代more与vim来分析文件内容,键入q表示退出交互浏览模式。

文件内容格式

223.104.7.59 - - [05/Dec/2018:00:00:01 +0000] "GET /topics/17112 HTTP/2.0"
 200 9874 "https://www.googleapis.com/auth/chrome-content-suggestions" "Mo
zilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15
(KHTML, like Gecko) CriOS/70.0.3538.75 Mobile/15E148 Safari/605.1" 0.040 0.040 .
123.125.71.60 - - [05/Dec/2018:00:00:02 +0000] "GET /yuanyibo/topics?locale=en HTTP/1.1" 200 12164 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" 0.032 0.032 .

IP 空 空 时间戳 用户请求(请求方法 地址 http协议版本) 状态码 字节数 Refer UserAgent 访问速度 访问速度 空

5.常用分析命令

less
sort  #排序
 sort -nr  #表示通过数字大小进行判断,如果不加n参数,则以ascii码进行比较
           #sort -n 相当于sql没有加desc  sort -nr 相当于sql加desc  r表示反向
uniq  #合并,展示合并的数量
 uniq -c   #在每列旁边显示改行重复出现的次数
6.grep -E 可以传递多个内容 ,使用 | 来分割多个pattern,以此实现OR操作


7.grep -e 和 grep -E的区别
	7.1grep -e 只能传递一个检索内容
 
grep -e pattern1 -e pattern2 filename

例如:
$ grep -e Tech -e Sales employee.txt  
100  Thomas  Manager    Sales       $5,000  
200  Jason   Developer  Technology  $5,500  
300  Raj     Sysadmin   Technology  $7,000  
500  Randy   Manager    Sales       $6,000 

   7.2grep -E 可以传递多个内容 ,使用 | 来分割多个pattern,以此实现OR操作

grep -E 'pattern1|pattern2' filenam
 
例如:
$ grep -E 'Tech|Sales' employee.txt  
100  Thomas  Manager    Sales       $5,000  
200  Jason   Developer  Technology  $5,500  
300  Raj     Sysadmin   Technology  $7,000  
500  Randy   Manager    Sales       $6,000

课件作业
课件作业一:
编写一个函数 find_error_log()
找出log中的404 500的报错 考察严谨性,某次训练没有一人做对

find_error_log() {
#方法一
less nginx.log | grep -E '(" 404 |" 500 )'          #这样写更加严谨,建议使用第二种方法

#方法二
less nginx.log | awk '$9~/404|500/{print $0}'       #也可以这样写 less nginx.log | awk '$9~/404|500/'   默认会打印$0
                                                   

awk '$9~/xxxx/'									    #字段匹配
awk '/xxx/'                                               #正则匹配
}

课件作业二:
find_top_3
找出访问量最高的ip, 统计分析,取出top3的ip和数量,打印出来。把函数和执行结果贴到回复里。记得使用代码格式化

find_top_3(){

less nginx.log | awk '{print $1}' | sort |uniq -c | sort -nr | head -3 | less  #sort -nr 表示通过数字大小进行判断,如果不加n参数,则以ascii码进行比较
}

课件作业三:
url_avg_time
找出首页访问 / 的平均响应时间,把函数与结果打印出来贴到回复里

首页访问示例,get后面的地址是/,每次访问的响应时间是倒数第二个字段

url_avg_time(){

less nginx.log | awk '$7 == "/"' | awk '{ sum += $(NF-1)} END {print sum/NR}'

}

课后作业:
找出访问量最高的页面地址 借助于sed的统计分析

/topics/16689/replies/124751/edit 把数字替换为 /topics/int/replies/int/edit
/_img/uploads/photo/2018/c54755ee-6bfd-489a-8a39-81a1d7551cbd.png!large 变成 /_img
/uploads/photo/2018/id.png!large
/topics/9497 改成 /topics/int
其他规则参考如上

输出

url pattern对应的请求数量
取出top 10请求量的url pattern

类似
288 url1
3000 url2

url_pattern(){

}

Menu:三剑客实战Linux性能统计分析(1)
1.ps -ef | head -3 # head -3 查看3行 查看进程列表,不关注性能

2.ps aux # 关注性能

3.ps -o user #只打印自己关注的user数据

4.封装自己的ps命令

ps_ex ()
{
    ps -o uname,pid,ppid,thcount,ni,pri,psr,pcpu,pmem,rss,vsz,sz,start_time,time,comm,c,command,args "$@"
}

作业1 统计aliyundun的性能 #阿里云盾的pid每次都是变化的
perf_get(){
/#todo: 输出20s内某个进程的每秒的cpu和mem,并最后空出一行统计平均性能
}

perf_get pid_or_name
cpu mem
3 4
2 6
2 2
3 4

10 2

avg
5.5 3.5

#shell自带的type命令输出

perf_get ()
{
    top -b -d 1 -n 20 | grep --color=auto --line-buffered -i yundun$ | awk 'BEGIN{print "cpu","mem"}{cpu+=$9;mem+=$10;print $9,$10}END{print "";print cpu/NR,mem/NR}'
}


#也可以通过bash来格式化 ,bash直接输入以上内容后,然后使用type perf_get  查看文件名称perf_get的格式化数据
# -b                										top 批处理
  -d 1   													top 1s打印一次
  -n 20  													top 打印20组数据
  -i yundun$												grep 找出yundun结尾的数据
  --line-buffered   										grep 一行一行输出
  {print "cpu","mem"}{cpu+=$9;mem+=$10;print $9,$10}        awk  找出$9、$10切片,并计算总和
  {print "";print cpu/NR,mem/NR}                            awk  打印空行,然后打印平均值   NR表示行数

#vs code+shell format

perf_get() {
    top -b -d 1 -n 20 |
        grep --color=auto --line-buffered -i yundun$ |     #管道结尾不需要加换行符
        awk '
    BEGIN{print "cpu","mem"}                               #刚开始打印一行,名称为cpu 和 mem ,作为第一行展示
    {cpu+=$9;mem+=$10;print $9,$10}					       #cpu初始化时有默认初始化值,默认为0
    END{print "";print cpu/NR,mem/NR}
    '
}

5.网络

Linux:
netstat -tlnp              			# -t表示tcp协议 -l表示监听,服务器对外开放的端口 -n表示不解析DNS名字,只打印ip地址 -p表示进程
netstat -tnp						#

Menu:三剑客实战Linux性能统计分析(2) bash教程

yum install -y netcat       	#安装nc,发现没有进行安装
yum search netcat           	#查找nc,发现nc在nmap-ncat目录下
yum install -y nmap-ncat    	#安装nc
nc -l -p  7777 -vv          	#nc 模拟开端口7777   -l监听端口 -p指定端口

nc shell.ceshiren.com 7777 -vv  #用户连接端口7777

###上述监听端口7777和连接用户端口7777可以进行传输会话

作业2 统计连接网络链接情况

connection_summary(){
#todo: 链接所有的端口和对应的tcp连接状态,找出他们的连接总数吧
netstat -tnp | awk 'NR>2' | awk '{print $4 , $6}' | sort -nr | uniq -c   #awk 'NR>2' 表示删除前面俩行数据的展示,从第三行开始
}

connection_summary
22 ESTABLISHED 100
22 CLOSED 3
7777 ESTABLISHED 20

#bash编程

seq  1 10    	#生成1到10的数字

seq  1 10 3     #表示生成一个1到10,步进为3

echo $((1+2))   #表示对变量进行计算

for i in "${array[@]}"; do echo $i ;done  #遍历数组,只有这一种正确的写法"${array[@]}",bash里面的数组和python有区别,bash数组下标不是按照顺序进行排序的,下标可能是0,1,2,10,11...


###抽奖脚本编写未完成,未听课程

Linux系统安装Python3环境(超详细)Linux软链接
https://www.pianshen.com/article/7542114600/

三种方式实现Linux的文件上传下载
https://blog.csdn.net/weixin_37490221/article/details/80844825

linux上安装和启动docker
https://blog.csdn.net/u010689849/article/details/88560045

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值