01 | Linux系统和Shell环境准备

运行shell

test.sh

#!/bin/bash

echo "hello"

运行脚本

方式一:

chmod+x ./test.sh

./test.sh

方式二:

/bin/sh test.sh 若以此方式运行,test.sh(shell脚本)中的 #!/bin/bash则不起作用

02 | Linux常用命令(文件/网络/性能)

文件

常用命令

ls | cd | pwd | mkdir | rmdir | cp | rm | mv

文件属性

image.png

修改文件属性

字母模式

chmod a+rwx file # 所有人 赋予 file1 读、写、执行 的权限

chmod a-rwx file # 所有人 取消 file1 读、写、执行 的权限

chmod u+r file # 只给 file1的拥有者 赋予 读 的权限

chmod g-w file # 只取消 同组人 写 的权限

chmod o+x file # 只给 其他人 赋予 file1 执行 的权限

chmod ug+x,o-w file # 给文件拥有者和同组人赋予执行权限,取消其他人的写权限

数字模式

chmod 777 file 等价于 chmod a+rwx file1 -rwxrwxrwx

chmod 765 file 等价于 chmod u+rwx,g+rw,o+rx file1 -rwxrw-r-x

chmod 432 file 等价于 chmod u+r,g+wx,o+w -r---wx-w-

网络

ping

1.-c ping的次数

2.-l 每次ping的时间间隔

netstat 打印Linux网络系统的状态信息

1.-t 列出所有tcp

2.-u 列出所有udp

3.-l 只显示监听端口

4.-n 拒绝显示别名,能显示数字的全部转化成数字(重要)

5.-p 显示进程的pid和名字

练习

netstat -apn | grep ssh 查看指定程序的端口

netstat -apn | grep ":80" 查看运行在指定端口的进程

性能

top 持续监视系统性能

ps 查看进程信息

1.-aux 显示所有进程,包括用户、分组情况

03 | Linux三剑客与管道使用

管道“|”:左边的输出作为右边的输入

正则表达式

举例

1.\bword\b 找出所有的word单词,word前后要有空格

2.\bword\b.*\bluck\b 第1个单词是word,最后1个单词是luck,中间为任意内容

3.0\d{2}-\d{8} 以0开头+两个数字+“-”+8个数字

常用的元字符

符号

说明

.

匹配换行符以外的任意字符

\w

匹配字母或数字或下划线或汉字

\s

匹配任意的空白符

\d

匹配数字

\b

匹配单词的开始或结束

^

匹配行首

$

匹配行尾

常用的限定符

符号

说明

*

重复零次或更多次

+

重复1次或更多次

重复零次或1次

{n}

重复n次

{n,}

重复n次或更多次,重复上限或下限

{n,m}

重复n到m次

实例

1.匹配以字母a开头的单词:\ba\w*\b

2.匹配刚好6个字符的单词:\b\w{6}\b

3.匹配1个或更多连续的数字:\d+

4.5到12位QQ号:\d{5,12}

grep

grep [options] pattern [file...]

pattern 可以是正则表达式

参数

1.-v 显示不被pattern匹配到的行

2.-i 忽略字符大小写

3.-n 显示行号

4.-c 统计匹配的行数

5.-o 仅显示匹配到的字符串

6.-E 使用ERE,相当于egrep

sed

流处理器,一次处理一行内容

若sed后不加任何参数,则只操作模式空间的内容,不操作原文件;若想修改原文件,需加参数-i

处理流程

image.png

格式

sed [-hn..][-e

命令解析

1.-h 显示帮助

2.-n 静默模式,仅显示script处理后的结果

3.-e

4.-f

常用命令

1.a:新增; sed -e '4a newline' ;在第4行后新增1行,内容为“newline”

2.c:取代;sed -e '2,5c number';用“number”取代2到5行的内容

3.d:删除;sed -e '2,5d';删除2到5行

4.i:插入;sed -e '2i newline';在第2行前插入1行,内容为“newline”

5.p:打印;sed -n '/root/p';打印与root匹配的行

6.s:取代;sed -e 's/old/new/g';全局替换,若没有g则只替换每行的第一个

注:-e可省略

练习

sed -i '$a abc\ndef\nghi' file 在文件末尾插入

sed -i '1i abc\ndef\nghi' file 在文件开头插入

-sed和grep的区别

1.grep只能查询

2.sed能够增删改查

awk

把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行后续处理

处理流程

image.png

格式

awk 'pattern + action' [FILE]

常用参数

1.BEGIN 处理文本之前要执行的操作

2.END 处理文本之后要执行的操作

3.FS(field separator) 输入字段分隔符,默认空格,相当于-F

4.NF(number fields) 当前输入记录的字段数(列数)

5.NR(number records) 目前为止看到的记录总数(行数)

6.OFS 输出域分隔符(不常用)

7.ORS 输出记录分隔符(不常用)

8.RS(record separator) 输入记录分隔符,默认换行符

9.$0 整条记录

10.$1 表示当前行的第一个字段

练习1

1.搜索/etc/passwd有root关键字的所有行:awk -F: '/root/{print $0}' /etc/passwd

2.打印/etc/passwd的第2行信息:awk -F: 'NR==2{print $0}' /etc/passwd

练习2

1.使用begin加入标题:awk -F: 'BEGIN {print "BEGIN,BEGIN"}{print $1,$2}' /etc/passwd

2.自定义分割符:echo "123|456|789" | awk 'BEGIN{RS="|"}{print $0}'

04 | Bash编程语法

变量

变量的作用范围只在当前窗口

规则

1.命名只能使用英文字母、数字、下划线,首个字符不能以数字开头

2.中间不能有空格,可以使用下划线

3.不能使用标点符号

4.不能使用bash里的关键字(可用help命令查看保留关键字)

定义与使用

your_name="abc"

echo $your_name

只读变量(不能修改和删除)

a="123"

readonly a

若想删除只读变量,把窗口关闭即可

删除变量(不能删除只读变量)

unset variable_name

变量类型

1.字符串:your_name="timothy"

2.拼接字符串:greeting="hello,"$your_name""

3.数组:array_name=(value0 value1 value2 value3)

4.取数组:value=${array_name[n]}

5.单独赋值:array_name[0]=value0

6.获取数组长度:${#array_name[*]}

练习

数组初始化

array=(a b c d e)

echo ${array[0]}

echo ${array[@]} 打印所有元素

echo ${array[*]} 同上

数组单个定义

array[0]=a

array[2]=c

echo ${array[*]}

if

格式

if condition

then

command1

command2

...

commandN

fi

注意

1.if [ a==1 ];若判断条件是双等号,可使用单中括号

2.if [[ a>1 ]];若判断条件是大于或小于时,要用双中括号;若想使用单中括号,需用-gt、-lt,如if [ a -gt 1]

3.中括号左右必须有空格,不能写成if[a==1]

运算符

符号

解释

-gt

greater than

-lt

less than

-ge

greater or equal

-le

less or equal

-eq

equal

-ne

not equal

练习

比较两个变量的大小并输出不同的值

if [ $a -eq $b ];then echo "equal"; elif [ $a -lt $b ];then echo "small";elif [ $a -gt $b ];then echo "big"; fi

for

格式

for var in item1 item2 ... itemN

do

command1

command2

...

commandN

done

练习

循环读取文件内容并输出

for i in ${cat test.txt};do echo "$i";done

while

定义

while condition

do

command

done

例子

int=1

while(( $int<=5 ))

do

echo $int

let "int++"

done

练习

循环读取文件内容并输出

while read line;do echo $line;done

05 | Bash脚本编写

read命令

概要

1.read命令是用于从终端或文件中读取输入的内部命令

2.读取整行输入

3.每行末尾的换行符不被读入

使用

1.读取标准输入内容并赋值给变量:read var

2.读取多个标准输入内容:read var1 var2 var3

3.不指定标量(默认赋值给REPLY):read

练习

read a

123

echo $a

read a b c

123 456 789

echo $a $b $c

read

012

echo $REPLY

脚本参数传递

1.$0 脚本名称

2.$1~$n 获取参数

3.$# 传递到脚本的参数个数

4.$$ 脚本运行的当前进程ID号

5.$* 显示所有的参数

6.$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

练习

test.sh

#!/bin/bash

echo "文件名:"$0

echo "入参个数:"$#

echo "所有入参:"$*

echo "第1、2、3个入参:"$1 $2 $3

echo "退出状态:"$?

运行test.sh

chmod u+x test.sh

bash test.sh 1 2 3

基本运算

1.加法 `expr $a + $b`

2.减法 `expr $a - $b`

3.乘法 `expr $a \* $b`

4.除法 `expr $b / $a`

5.取余 `expr $a % $b`

6.赋值 a=$b

7.相等 [ $a == $b ]

8.不相等 [ $a != $b ]

bash与目录命令

创建目录并生成文件

mkdir test

cd test

echo "hello" > test.txt

ls

bash与内存

统计内存使用

for i in `ps aux | awk '{print $6}' | grep -v 'RSS'`

do

echo `expr $i / 1024`

done

06 | Nginx日志分析

shell命令中单引号和双引号的区别:单引号里内容不转义,双引号里的内容会转义,举例说明:

a=123

echo '$a' 输出$a,$a未转换

echo "$a" 输出123,$a转换为变量值

grep只支持基本正则,不支持扩展正则,要使用“|”需用egrep,举例说明:

egrep "ab[c|cc]" test.sh

输出abc abcc

出现次数最多的ip个数

awk '{print $1}' nginx.log | sort | uniq -c | sort -nr | head -3

grep -o '^[0-9]*.[0-9]*.[0-9]*.[0-9]*' nginx.log | sort | uniq -c | sort -nr | head -3

替换

grep "/topics/" nginx.log | sed 's#/topics/[0-9]*#/topics/number#g'

将ip地址横向打印

awk '{print $1}' nginx.log | sed ':1;N;s/\n/|/g;t1'

N 将下一行读取到模式空间

:1 标记

t1 t1前的命令执行成功,就跳转到标记1

反复执行":1"和"t1"之间的命令

07 | Linux性能统计分析

uptime

命令说明

命令

全称

说明

mpstat

Multiprocessor Statistics

多处理器状态

vmstat

virtual memory statistics

虚拟内存状态

iostat

input output statistics

输入输出状态

uptime

15:52:31 up 4 days, 21:33, 1 user, load average: 0.00, 0.01, 0.05

当前时间 总开机时间 当前用户 负载(1分,5分,15分)

负载

特定时间间隔内运行队列中的平均进程数。进程满足以下条件则位于运行队列中:

1.未等待I/O操作的结果

2.未主动进入等待状态(未调用wait)

3.未被停止(等待终止)

一般来说,每个CPU内核当前活动进程数不大于3,则表示系统运行表现良好。若是多核则需要累加,即4核cpu<12

dmesg | tail -20

打印系统日志

vmstat

image.png

虚拟内存:磁盘的部分空间被当做内存使用

cache:CPU和内存之间的高速缓冲存储器

buffer:内存和磁盘之间的缓冲器

分页:将磁盘空间转换为虚拟内存的技术

vmstat.png

字段说明

procs(进程):

1.r:运行队列中进程数量,可判断是否需要增加CPU(长期大于1)

2.b:等待IO的进程数量

memory(内存):

1.swpd:使用虚拟内存大小,此值越大说明物理内存已不够用

2.free:空闲物理内存大小

3.buff:用作缓冲的内存大小

4.cache:用作缓存的内存大小

CPU:

1.us:用户进程执行时间

2.sy:系统进程执行时间

3.id:空闲时间(包括IO等待时间),中央处理器的空闲时间

4.wa:等待IO时间

mpstat

语法

mpstat [-P ] [internal [count]]

1.-P 指定CPU

2.internal:相邻两次采样的间隔时间

3.count:采样次数

参数

image.png

参数

说明

%usr

用户级(应用程序)执行时发生的CPU利用率百分比

%nice

优先级较高的用户级别执行时发生的CPU利用率百分比

%sys

系统级(内核)执行时发生的CPU利用率百分比

%iowait

系统有未完成的磁盘I / O请求时一个或多个CPU空闲的时间百分比

%irq

一个或多个CPU服务硬件中断所花费的时间百分比

%soft

一个或多个CPU服务软件中断所花费的时间百分比

%idle

一个或多个CPU空闲且系统没有未完成的磁盘I / O请求的时间百分比

理解iowait

CPU空闲时间处理io请求的占比

image.png

CPU可以并行处理io请求

image.png

其他命令

pidstat

iostat

free -m

top

1.%CPU是CPU每个核占比的累加

08 | 三剑客实战抽奖程序脚本

抽奖实现1:有空白

#!/bin/bash

rand() {

seeds=`while read line; do echo ${line// /..}; done < wx.txt`

while [[ $count != 1 ]];do

seeds=`for seed in $seeds;do (($RANDOM%2==0)) && echo $seed; done` # seeds只有1个元素时,$RANDOM%==1,此时会输出空白

count=`echo "$seeds" | wc -l`

done

echo $seeds

}

rand

抽奖实现2:无空白

#!/bin/bash

rand() {

local count

local seeds

count=0

seeds=`while read line; do echo ${line// /..}; done < wx.txt`

while [[ $count != 1 ]];do

seeds=`for seed in $seeds;do (($RANDOM%2==0)) && echo $seed; done`

count=`echo "$seeds" | wc -l`

done

if [[ $seeds == "" ]];then

rand # 这里用到了递归

fi

if [[ $seeds != "" ]];then

echo $seeds

fi

}

while true;do

rand

sleep 1s

done

抽奖实现3:去重

rand() {

local seeds

local count

count=0

seeds=`while read line;do echo ${line// /..}; done

while [[ $count != 1 ]];do

seeds=`for seed in $seeds;do (($RANDOM%2==0)) && echo $seed;done`

count=`echo "$seeds" | wc -l`

done

if [[ $seeds == "" ]];then

rand

fi

if [[ $seeds != "" ]];then

echo $seeds

fi

}

res() {

for i in `eval echo {1..$1}`;do

tmp=`rand`

while [[ `is_repeat $tmp` == 0 ]];do

tmp=`rand`

done

arrs[$i]=$tmp

done

echo ${arrs[@]}

}

is_repeat() {

for arr in ${arrs[@]};do

if [[ $arr == $1 ]];then

#此处需要有echo,因为子进程只能捕获echo的输出,不能捕获return的值

echo 0

return 0

fi

done

#输出1的逻辑在这里,因为需要遍历完整的数组后,才能输出1

echo 1

}

res $1

其他

1.echo $var 把所有行合并成1行输出

2.echo "$var" 按原格式输出

设置vim编辑器一直显示行号

vim ~/.vimrc

set nu

linux sed 测试文件夹,测试开发笔记二(Linux与Shell脚本)相关推荐

  1. linux java读取文件夹下文件名,Java获取Linux上指定文件夹下所有第一级子文件夹...

    说明:需要只获得第一级文件夹目录 package com.sunsheen.jfids.studio.monitor.utils; import java.io.BufferedReader; imp ...

  2. linux中wine文件夹在哪,科学网—Linux下wine的安装和使用以及CAJviewer的安装 - 苗玉虎的博文...

    最近突然想使用caj软件看文献,发现linux不支持,so百度一下如何安装,搜到好多,但很多都很乱,遂记下自己的心路历程,以示记载,或许时间久了忘记,留个备份吧,也希望对他人有帮助. 下载好CAJvi ...

  3. linux对某个文件进行操作步骤,实验二 Linux系统简单文件操作命令

    项目 内容这个作业属于哪个课程 学号-姓名 17043212-龚雨豪 作业学习目标 1. 学习在Linux系统终端下进行命令行操作: 2. 掌握常用命令行操作并能通过命令行操作解决简单问题. 操作步骤 ...

  4. 电脑上的linux是什么文件夹,linux删除文件夹,详细教您电脑的linux怎么样删除文件夹...

    上期小编讲解了重装系统win7旗舰版64位教程,本次正特手机网小编给大家讲解一下linux删除文件夹,详细教您电脑的linux怎么样删除文件夹,linux主要是做什么用的?有用户在网上提出这样的提问, ...

  5. linux复制文件夹排除文件,【linux】复制文件夹中文件,排除部分文件

    用字符流实现每个文件夹中创建包含所有文件信息的readme.txt package com.readme; import java.io.BufferedWriter; import java.io. ...

  6. linux 删除tmp文件夹,Linux下tmp文件夹的文件自动删除的问题(转)

    场景: 近日发现有一台机器tmp文件夹下放置的文件无辜丢失,而且排查发现是自动丢失,并且,只是删除10天之前的文件. 本来以为是哪位写了一个自动执行脚本, find了一下10天前的文件删除了. 结果, ...

  7. ftp服务器文件在哪,linux ftp服务器文件夹在哪

    linux ftp服务器文件夹在哪 内容精选 换一换 已获取到Android SDK镜像包,并通过MobaXterm工具上传到服务器上的/home目录下.获取方法请参见获取软件包.添加完成后如下图所示 ...

  8. Java 获取linux根目录下的文件夹_Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux...

    2020年第一波薅当当网羊毛的机会,别错过! 晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 微软,致力于做最好的Linux发行版. 今天,安装Windows 10测试版本号19603的用 ...

  9. linux替换某个文件夹下所有文件,Linux 批量查找并替换文件夹下所有文件的内容...

    1.批量查找某个目下文件的包含的内容 cd etc grep -rn "查找的内容" ./ 2.批量替换某个目下所有包含的文件的内容 cd etc sed -i "s/查 ...

最新文章

  1. python3 decode encode 字符串 字节 互转
  2. 精通python网络爬虫-精通Python网络爬虫 PDF 高清版
  3. 服务器运行jupyter notebook,解决办法
  4. 西瓜仿站高手v1.08官方正式版
  5. 作业 给计算机编号 winform
  6. 批量添加后缀_掌握这 6 个批量处理技巧,少做 80% 的无用功!
  7. 利用MSF批量打RMI漏洞
  8. 第 6 章 认知吝啬鬼
  9. 利用EasyRecovery深度扫描功能将桌面误删文件恢复
  10. MaterialImageLoading
  11. 图片点击后出现模态框效果的实现
  12. 走楼梯c语言程序,动态规划走楼梯
  13. C++代码静态分析与优化(10)_rats
  14. SCI写作必备英文单词、语法检查工具
  15. VCS仿真学习(5)Debugging with DVE
  16. android业余手机开发,赚钱心得
  17. 关于安卓机型写串码 改串码 端口开启和基带qcn等一些经验
  18. matlab中画出3d船舶,船舶运动仿真中航迹与船形图的应用(上)
  19. 读书笔记:Spring in action 第2章
  20. 重磅!新职业技能证书来了,让你高薪就业

热门文章

  1. 1:Hello world
  2. 【实操】Y7000P 2020款安装黑苹果完整步骤记录
  3. 布隆过滤器(Bloom Filter)原理及优缺点剖析
  4. kafka单机安装(版本kafka_2.11-2.2.0.tgz)
  5. jvm的架构模型:基于栈式的架构和基于寄存器架构的特点
  6. JVM调优:使用G1垃圾回收器
  7. Zuul默认路由规则
  8. Python3逻辑运算符
  9. 重启docker 服务命令
  10. jQuery easyUI--tabs选项卡面板