Linux、shell

297 阅读7分钟

mkdir : 创建目录 mkdir d d/e d/e/f :套娃创建文件夹 mkdir -p d/e/f :快捷创建 rmdir 目录: 删除目录

touch 文件名 : 可以创建一个空文件 vim 如果文件内容为空,直接q退出不创建,wq可以保存创建退出

rm : 删除文件或者目录 rm -r a :能删除不是空的a文件 rm -rf a/:能没有提示删除不是空的a文件

mv 文件名 要移动到的文件a/b/ :移动文件 mv 文件名 要修改的文件名 :可以修改文件名

ln -s 文件名或者目录名 链接的名字 : 创建一个软链接 ln 文件名或者目录名 链接的名字 : 创建一个硬链接

echo 要添加的内容 >> 到文件 :添加内容到文件 echo 要覆盖的内容 > 到文件 :覆盖内容到文件

useradd 用户名 : 添加用户 passwd 用户名:修改用户密码 su 用户名 :跳到其他用户

ll后第一个字母对应内容

  • :文本 d :目录文件 l : 链接

组、改变文件权限

usermod -g 组名 用户名 :把用户改变组 chmod 777 文件名或者目录名 :修改权限 groupadd 组名:添加组 useradd -g 组名 用户名:把用户加进组里

查找

find /要找到路径(比如root) -name(user用户名、size文件大小) 要找的名字(也可以"*.cfg"后缀名)

定位 locate

locate 文件名

grep -n 要查询的内容 在哪个文件查:查找这个文件里面的这个内容,-n可以匹配行号显示

wc 文件名 :统计行数,字节大小,等等

| :管道,可以跟命令查要查询的东西,比如ls | grep .cfg 就是列出带cfg后缀的文件 可以混合使用; grep -n boot initial-setup-ks.cfg | wc :查询统计的boot的行号,出现的次数,字节大小

压缩、解压

gzip 文件名:压缩成.gz文件 gunzip 文件名称.gz :解压文件

zip -r 压缩成的文件名 文件 :能打包压缩文件,可以修改压缩的名字 unzip -d 要解压到的目录 文件 :能解压文件到自己指定的目录下

tar打包工具

tar [选项] xxx.tar.gz 要打包的内容 :打包目录,压缩后的文件格式tar.gz 选项说明:-c产生.tar打包文件 -v显示详细信息 -f指定压缩的文件名 -z打包同时压缩 -x解压包 -C解压到指定目录 打包:tar -zvcf temp.tar.gz initial-setup-ks.cfg info 公共/ 解包:tar -zxvf temp.tar.gz -C /tmp

tree 目录 : 树形显示目录结构 du [选项] : 列出目录结构(选项 -h 以容易阅读的方式显示 -a 不仅查看子目录大小,还包括文件 -c显示所有目录和子目录文件后,显示大小总和 -s只显示总和大小 ) du --max-depth=n [选项] : 列出多少层的目录结构

df -h : 查看磁盘使用情况

挂载

mount 光盘或硬盘位置,文件(/etc/cdrom) 要挂载的位置(/mnt/cdrom/) : 挂载光盘或硬盘 umount 挂载的位置或者是光盘的位置 : 取消挂载

lsblk:查看磁盘情况 lsblk -f :查看详情情况

root用户查看详情磁盘情况

fdisk -l : 查看磁盘详情 mkfs -t 磁盘的存储类型(xfs) 位置(/dev/sdb) :修改磁盘的类型

查看进程

ps [选项] : 查看进程,可以接管道搜索| ,选项有(a、u、x、-e、-u、-f) 基本语法:ps aux | grep xxx
ps -ef ! grep xxx 进程ps选项.png

杀死进程

kill 进程号(pid) :杀死对应的进程(加个-9选项则是强行杀掉) killall 进程名 : 把所有该进程都杀死

开启进程

systemctl start 进程名(比如sshd):开启进程 systemctl status 进程名 :查看这个进程状态

树状进程

pstree (可以加选项也可以不加-p 、-u)

实时查看进程

top[选项] (选项有-d 秒数指定top多少秒刷新一次,-i 不显示任何闲置或者是僵尸状态,-p仅仅监控某个进程的状态)

进程管理

netstat [选项] 也可以加管道|筛选 一般就是netstat -anp | grep进程号 netstat -nlp | grep 进程号

netstat.png

系统定时任务

crontab[选项] :可以定时执行自己想要的操作(-e写入定时操作,-r取消定时操作) 在文件里面写入 比如 */1 * * * * echo hello,word >> /root/info 每隔一分钟在info文件写入helloword

RPM软件包管理

查看信息

rpm -qa | grep firefox :查询火狐的安装包 rpm -qi | grep firefox :查询火狐的安装信息

卸载

rpm -e firefox :卸载火狐

安装

rpm -ivh firefox全称 :安装火狐(i安装v显示详细信息h进度条)

YUM仓库配置,一键安装软件

yum 【选项】【参数】 软件名: 安装、查看、卸载软件(选项:-y 一直yes安装或者卸载) 参数:list查看这个软件是否存在 install安装软件 remove卸载软件

重启:reboot

shell

shell脚本编写,创建文件后面加上.sh,文件第一行写#!bin/bash 创建文件:touch hello.sh 打开文件:vim hello.sh 编写

第一种:少众执行代码:bash或sh 文件的路径 比如:bash(sh) root/script/hello.sh 第二种:直接相对或者是绝对路径,但是要先赋予可以执行文件的这个权限 chomd +x hello.sh :添加执行权限 第三种:.或者source 文件的相对路径或者绝对路径(当前路径执行) source /root/script/hello.sh

查看系统变量

echo $HOME env 是看系统的全局变量 set 是看系统和用户的变量

自定义变量

直接a=2,不能用空格 如果里面有空格,就用引号 may_var="hello, word" : 定义的是一个局部变量 export :升级为全局变量 -- export may_var

父类shell中的全局变量子类shell可以看到,但是子类shell改了这个变量的话,父类shell中不受影响

运算

的话要a=((1+8))或者是a=((1+8))或者是a=[1+10] 可以设置只读变量:readonly a=5;那他就不能修改了

或者是 expr 1 + 2 :要有空格,乘以*要加转义变成*

赋值:

a=(expr5\*2)a=(expr 5\*2) a=[52] a=$((52))

撤销变量

unset 变量名

传入参数

hello.sh文件里面$[参数] 表示一个参数,在调用source hello.sh 参数:

传参.png

其他参数

$? :返回0表示上次语句执行正确,其他数字表示相应的错误

判断是否相等

a=hello test a=hello或者是[a=hello 或者是[ a=hello ]一个中括号,中间要空格 echo ? 输出看看上一条语句对不对 也可以判断文件能不能读写执行 ![panduan.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/620e2eb6e6784578b69dc3ff356a2a45~tplv-k3u1fbpfcp-watermark.image?) 多条件判断,可以加一个&&与或者是||或符合判断 a=15 [ a -lt 20 ] && echo "a<20"echo"a < 20 " || echo "a > 20"

if分支

可以进行条件判断或者多条件 a=18 if [ a -lt 20 ] && [ a -gt 15 ]; then echo OK; fi :如果a小于20并且大于15,就输出ok,||就是或 也可以if[ $a -lt 20 -a -gt 15];then echo OK;fi :-a相当于and ;-o相当于or

if.png

多分支

if [ 2lt18]thenecho"未成年人"elif[2 -lt 18 ] then echo "未成年人" elif [ 2 -lt 30 ] then echo "青年人" elif [ $2 -lt 60 ] then echo "中年人" else echo "老年人" fi

case判断

case $1 in 1) echo "this one" ;; 2) echo "this two" ;; *) echo "number else" ;; esac

case.png

for循环语句

for (( i=1; i <= 1;i++))dosum=1 ; i++ )) do sum=[ sum+sum + i ] done echo $sum

for.png

增强for循环

for i in {1..100};do sum=[[ sum + i];done;echoi ];done;echo sum for os in linux windows macos;do echo $os;done

goodfor.png

@@,当这个参数被引起来时,@和@*,当这个参数被引起来时,*是输出一行,把他当做一个整体;$@是一行一行输出,当成个体

可以输入let脚本,直接就能输入+=或者是++

while循环

#while循环 a=1 while [ alta -lt 1 ] do

sum2=[[ sum2 + $a ]

a=[[ a + 1 ]

let sum2+=a let a++ done echo $sum2 while.png

read读取控制台

read -t 5 -p "请输入你的名字" name echo "welcome,$name" read.png

basename提取文件名

basename 文件名 后缀 :能提取文件名 比如:absename /root/script/hello.txt .txt :可以提取到hello

dirname提取文件路径

dirname ../script/hello.txt :不管文件存不存在,提取最后一个斜杠前面的路径名(输出../script)

function自定义函数

function add(){ s=[[1 + 2]echo2] echo s }

read -p "请输入第一个数:" a read -p "请输入第二个数: " b

summ=(add(add a b)echo"和:"b) echo "和:"summ echo "和的平方:"[[summ *$summ] function.png

实操题运用:归档文件

归档文件0.png

guidangwenjian1.png

guidangwenjian2.png

wenjianguidang3.png

正则表达式

zhengze0.png

zhengze1.png 可以匹配比如 以a开头,中间包含任意字符,以in结尾: cat /etc/passwd | grep ^a.*in$

匹配字符区间

zifuqujian.png 比如可以 cat /root/atguigu | grep r[ab]*t :看这个目录下rt中间有ab字符串的文件

转义字符

转义字符.png 比如像一些特殊符号,需要加上转义用单引号才能使用,'\'

题目:匹配手机号

第一种:echo "15678932777" | grep ^1[345789][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]第二种:echo"13678932777"grepE1[345789][09]9 第二种:echo "13678932777" | grep -E ^1[345789][0-9]{9}

cut截取字段

cut截取.png 比如在cut.txt文件以空格为分割,截取第一第二列的内容:cut -d " " -f 1,2 cut.txt 截取ip地址:ifconfig ens33 | grep netmask | cut -d " " -f 10 :ifconfig ens33里面,查找netmask那一行,截取以空格为分割第十列

awk文本分析

awk.png

awk内置变量

awk内置变量.png 在passwd目录下显示文件名行号列数: awk -F ":" '{print "文件名:"FILENAME "行号:" NR "列数:"NF}' /etc/passwd 输出ifconfig下的空行:ifconfig | awk '/^$/ {print "空行:"NR}'

截取ip地址: ifconfig | awk '/netmask/ {print 2}' **比如截取以passwd下以root开通头的第七列**:cat /etc/passwd | awk -F ":" '/^root/ {print 7} ' 用cut操作是:cat /etc/passwd | grep ^root | cut -d ":" -f 7

比如截取以passwd下以root开通头的第一列和第七列,中间逗号分开:cat /etc/passwd | awk -F ":" '/^root/ {print 1","1","7} '

比如截取以passwd下的第一列和第七列,中间逗号分开,前面加上”user,shell“,后面加上”end,shell“:cat /etc/passwd | awk -F ":" 'BEGIN{print "user,shell"}{print 1","1","7} END{print "end,shell"}'

综合案例二:

zongheanli.png 给其他用户发信息:write tony pts/1(然后输入内容)先判断消息有没有开:masg y

#!/bin/bash #查看用户是否登录 #-i忽略大小写 -m提取第一行 拿到第一列用户名 login_user=(whogrepim1(who | grep -i -m 1 1 | awk '{print 1}') #-z判断是不是为空 if [ -z login_user ] then echo "1 不在线" echo "退出脚本" exit fi #看看消息功能有没有打开 is_allowed=(who -T | grep -i -m 1 1 | awk '{print 2}') #-z判断是不是为空 if [ isallowed!="+"]thenecho"is_allowed != "+" ] then echo "1 没有打开消息队列" echo "退出脚本" exit fi #判断有没有消息发送 if [ -z 2 ] then echo "没有消息发送" echo "退出脚本" exit fi #从参数获取要发送的消息 whole_msg=(echo * | cut -d " " -f 2-) #获取用户的终端 user_terminal=(who | grep -i -m 1 1 | awk '{print 2}') #写入要发送的消息 echo wholemsgwritewhole_msg | write login_user userterminalif[user_terminal if [ ? != 0 ] then echo "发送失败" else echo "发送成功" fi exit