Linux&Shell基础入门笔记
Linux&Shell基础入门笔记
linux------目录文件
/bin:binary,存放常用命令
/sbin:存放系统管理员使用的系统管理程序
/home:存放普通用户的主目录
/root:系统管理员主目录
/lib:系统开机所需要最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
/lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一一些文件。
/etc:所有的系统管理所需要的配置文件和子目录。
/usr:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
/boot:这里存放的是启动Linux时使用的一 些核心文件,包括-些连接文件以及镜像文件,自己的安装别放这里。
/proc:这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
/srv:service缩写, 该目录存放一 些服务启动之后需要提取的数据。
/sys:这是inux2 .6内核的-个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统sysfs。
/tmp:这个目录是用来存放一 些临时文件的。
/dev:类似于windows的设备管理器,把所有的硬件用文件的形式存储。
/media(CentOS6):linux系统会自动识别一 些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。CentOS7迁移到 /run/media
/mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里的内容了。
/opt:这是给主机额外安装软件所摆放的目录。比如你安装一个mysq|数据库则就可以放到这个目录下。默认是空的。
/var:这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
网络配置
三种连接模式
-
桥接模式
虚拟机直接连接外部物理网络的模式,主机起到了网桥的作用。这种模式下, 虚拟机可以直接访问外部网络,并且对外部网络是可见的。
-
NAT模式(NetWork Address Transition)
虚拟机和主机构建一个专用网络,并通过虚拟网络地址转换(NAT) 设备对IP进行转换。 虚拟机通过共享主机IP可以访问外部网络,但外部网络无法访问虚拟机。
- 仅主机模式
虚拟机只与主机共享一个专用网络,与外部网络无法通信。
配置网络ip地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改下面加粗部分,地址根据自身情况替换
service network restart
TYPE=“Ethernet” #网络类型(通常是 Ethemet)
PROXY_METHOD=“none”
BROWSER_ONLY=“no”
BOOTPROTO=“static” #IP 的配置方法[none|static|bootp|dhcp](引导
时不 使用协议|静态分配 IP|BOOTP 协议|DHCP 协议)
DEFROUTE=“yes”
IPV4_FAILURE_FATAL=“no”
IPV6INIT=“yes”
IPV6_AUTOCONF=“yes”
IPV6_DEFROUTE=“yes”
IPV6_FAILURE_FATAL=“no”
IPV6_ADDR_GEN_MODE=“stable-privacy”
NAME=“ens33”
UUID=“e83804c1-3257-4584-81bb-660665ac22f6” #随机 id
DEVICE=“ens33” #接口名(设备,网卡)
ONBOOT=“yes” #系统启动的时候网络接口是否有效(yes/no)
#IP 地址
IPADDR=192.168.111.100
#网关
GATEWAY=192.168.111.2
#域名解析器
DNS1=192.168.111.2
(1)物理机能 ping 通虚拟机,但是虚拟机 ping 不通物理机,一般都是因为物理机的
防火墙问题,把防火墙关闭就行
(2)虚拟机能 Ping 通物理机,但是虚拟机 Ping 不通外网,一般都是因为 DNS 的设置有
问题
(3)虚拟机 Ping www.baidu.com 显示域名未知等信息,一般查看 GATEWAY 和 DNS 设
置是否正确
(4)如果以上全部设置完还是不行,需要关闭 NetworkManager 服务
systemctl stop NetworkManager 关闭
systemctl disable NetworkManager 禁用
(5)如果检查发现 systemctl status network 有问题 需要检查 ifcfg-ens33
配置主机名
vim /etc/hostname
或者
hostnamectl set-hostname 名字
hostnamectl或者hostname查看
域名解析,修改hosts映射文件
vim /etc/hosts
ip 主机名
-------------------------
192.168.111.100 hadoop100
-------------------------
远程连接:ssh root@hadoop100
linux系统管理
进程&服务
- 计算机中,一个正在执行的程序或命令,被叫做“进程“( process )
- 启动之后一只存在、常驻内存的进程,一般被称作“服务”( service )。
service(centos 6)
-
基本语法
service 服务名 start|stop|restart|status ---------------------------------------- /etc/init.d
systemctl(cenos 7)
-
基本语法
systemctl start|stop|restart|status 服务名 ------------------------------------------ usr/lib/systemd/system
系统运行级别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aduiXvRQ-1677034570742)(null)]
- 查看默认级别:vi /etc/inittab
- Linux系统有7种运行级别:常用 3 和 5
- 运行级别
- 运行级别0:系统停机状态,系统默认运行级别不能设为,否则不能正常启动
- 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
- 运行级别2:多用户状态(没有NFS),不支持网络
- 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
- 运行级别4:系统未使用,保留
- 运行级别5: X11控制台,登陆后进入图形GUI模式
- 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
4.centos7的运行级别简化为:
- multi-user.target(等价于3)
- graphical.target(等价于5)
5.查看当前运行级别
systemctl get-default
6.切换运行级别
init 3
基本命令
ln软链接
ln -s /root/info myInfo
------------------------
ln -s 目标文件 重命名文件
useradd
-
基本语法
useradd 用户名 useradd -g 组名 用户名 cat /etc/passwd
为用户获取sudo权限
vim /etc/sudoers
------------------
用户名 ALL=(ALL) ALL
%用户组名 ALL=(ALL) ALL #为整个用户组添加权限
用户组 操作
添加用户组
groupadd 用户组名
将用户添加到用户组
usermod -g 用户组 用户名
修改用户组名字
groupmod -n 新用户名 旧用户名
删除用户组
groupdel 用户组名
文件属性
如果没有权限,就会出现减号[ - ]。从左至右用0-9这些数字来表示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tqg5Z0RR-1677034574203)(null)]
(1)0 首位表示类型
在Linux中第一个字符代表这个文件是目录、文件或链接文件等等
- 代表文件
d 代表目录
l 链接文档(link file)
(2)第1-3位确定属主(该文件的所有者)拥有该文件的权限。—User
(3)第4-6位确定属组(所有者的同组用户)拥有该文件的权限,—Group
(4)第7-9位确定其他用户拥有该文件的权限 —Other
rwx 作用文件和目录的不同解释
- 作用到文件:
[ r ]代表可读(read): 可以读取,查看
[ w ]代表可写(write): 可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件
[ x ]代表可执行(execute):可以被系统执行
- 作用到目录:
[ r ]代表可读(read): 可以读取,ls查看目录内容
[ w ]代表可写(write): 可以修改,目录内创建+删除+重命名目录
[ x ]代表可执行(execute):可以进入该目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D12yd6Ov-1677034574120)(null)]
(1)如果查看到是文件:链接数指的是硬链接个数。
(2)如果查看的是文件夹:链接数指的是子文件夹个数。
更改文件权限
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cnzBa40u-1677034574758)(null)]
- 第一种方式变更权限
chmod [{ugoa}{+-=}{rwx}] 文件或目录
如:chmod u=rw 文件名
chmod g+r 文件名
-------------------------------------
- 第二种方式变更权限
chmod [mode=421] [文件或目录]
如:chmod 777
修改整个文件夹里面所有文件的权限
chmod -R 777 文件夹名/
更改文件所有者
chown [选项] [最终用户] [文件或目录]
更改文件所属组
chgrp [最终用户组] [文件或目录]
文件查找
find
(1)按文件名:根据名称查找/目录下的.txt文件。
[root@hadoop101 ~]# find -name "*.txt"
--------------------------------------------------------------
(2)按拥有者:查找/opt目录下,用户名称为tony的文件
[root@hadoop101 ~]# find /opt -user tony
---------------------------------------------------------------
(3)按文件大小:在/home目录下查找大于200m的文件(+n 大于 -n小于 n等于)
[root@hadoop101 ~]find /home -size +204800
locat
updatedb
locadte tmp
文件压缩
zip:
zip -r 压缩后的名称(my.zip) 文件地址
unzip -d 指定目录 压缩文件
tar:
tar [选项] XXX.tar.gz 文件
------------------------------------
-c 产生.tar 打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-z 打包同时压缩
-x 解包.tar 文件
-C 解压到指定目录
-------------------------------------
打包:tar -zcvf xxx.tar.gz 文件
解包:tar -zxvf xxx.tar.gz 文件
磁盘查看和分区类
du
du 目录/文件
----------------------------------------------------
-h 以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-a 不仅查看子目录大小,还要包括文件
-c 显示所有的文件和子目录大小后,显示总和
-s 只显示总和
--max-depth=n 指定统计子目录的深度为第 n 层
df查看磁盘空间使用情况
df -h
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hUbxhhbm-1677034574373)(null)]
lsblk查看设备挂载情况
mount/umount挂载/卸载
mount [-t vfstype] [-o options] device dir (功能描述:挂载设备)
umount 设备文件名或挂载点 (功能描述:卸载设备)
--------------------------------------------------------------
-t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:
光盘或光盘镜像:iso9660
DOS fat16 文件系统:msdos
Windows 9x fat32 文件系统:vfat
Windows NT ntfs 文件系统:ntfs
Mount Windows 文件网络共享:smbfs
UNIX(LINUX) 文件网络共享:nfs
-o options 主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
iocharset:指定访问文件系统所用字符集
device 要挂接(mount)的设备
dir 设备在系统上的挂接点(mount point)
----------------------------------------------------------------
vim /etc/fstab
查看设备所有挂载信息
fdisk分区
fdisk -l (功能描述:查看磁盘分区详情)
fdisk 硬盘设备名 (功能描述:对新增硬盘进行分区操作)
--------------------------------------------------
(1)Linux 分区
Device:分区序列
Boot:引导
Start:从X磁柱开始
End:到Y磁柱结束
Blocks:容量
Id:分区类型ID
System:分区类型
(2)分区操作按键说明
m:显示命令列表
p:显示当前磁盘分区
n:新增分区
w:写入分区信息并退出
q:不保存分区信息直接退出
---------------------------------------------------
创建sdb1分区,并将/home/atguigu挂载到该分区
p主分区e扩展分区,最多有4个主分区,一共最多16个
mkfs格式化 创建文件系统:mkfs -t xfs /dev/sdb1
mount /dev/sdb1 /home/atguigu
ps查看当前系统进程
ps aux | grep xxx (功能描述:查看系统中所有进程)
ps -ef | grep xxx (功能描述:可以查看子父进程之间的关系)
----------------------------------------------------
a 列出带有终端的所有用户的进程
x 列出当前用户的所有进程,包括没有终端的进程
u 面向用户友好的显示风格
-e 列出所有进程
-u 列出某个用户关联的所有进程
-f 显示完整格式的进程列表
--------------------------------------------------------
USER:该进程是由哪个用户产生的
UID:用户 ID
PID:进程的 ID 号
C:CPU 用于计算执行优先级的因子。数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;数值越小,表明进程是 I/O 密集型运算,执行优先级会提高
STIME:进程启动的时间
%CPU:该进程占用 CPU 资源的百分比,占用越高,进程越耗费资源;
%MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源;
VSZ:该进程占用虚拟内存的大小,单位 KB;
RSS:该进程占用实际物理内存的大小,单位 KB;
TTY:该进程是在哪个终端中运行的。对于 CentOS 来说,tty1 是图形化终端,tty2-tty6 是本地的字符界面终端。pts/0-255 代表虚拟终端。
STAT:进程状态。常见的状态有:R:运行状态、S:睡眠状态、T:暂停状态、
Z:僵尸状态、s:包含子进程、l:多线程、+:前台显示
START:该进程的启动时间
TIME:该进程占用 CPU 的运算时间,注意不是系统时间
COMMAND:产生此进程的命令名
CMD:启动进程所用的命令和参数
pstree进程树
-p 显示进程的 PID
-u 显示进程的所属用户
netstat显示网络状态和端口占用信息
netstat -anp | grep 进程号 (功能描述:查看该进程网络信息)
netstat –nlp | grep 端口号 (功能描述:查看网络端口号占用情况)
------------------------------------------------------
-a 显示所有正在监听(listen)和未监听的套接字(socket)
-n 拒绝显示别名,能显示数字的全部转化成数字
-l 仅列出在监听的服务状态
-p 表示显示哪个进程在调用
crontab计划任务
-e 编辑 crontab 定时任务
-l 查询 crontab 任务
-r 删除当前用户所有的 crontab 任务
---------------------------------
第一个“*” 一小时当中的第几分钟 0-59
第二个“*” 一天当中的第几小时 0-23
第三个“*” 一个月当中的第几天 1-31
第四个“*” 一年当中的第几月 1-12
第五个“*” 一周当中的星期几 0-7 ( 0 和 7 都 代 表 星 期 日)
----------------------------------------------------------
* 代表任何时间。比如第一个“*”就代表一小时中每分钟都执行一次的意思。
, 代表不连续的时间。比如“0 8,12,16 * * * 命令”,就代表在每天的 8 点 0 分,12 点 0 分,16 点 0 分都执行一次命令
- 代表连续的时间范围。比如“0 5 * * 1-6 命令”,代表在周一到周六的凌晨 5 点 0 分执行命令
*/n 代表每隔多久执行一次。比如“*/10 * * * * 命令”,代表每隔 10 分钟就执行一遍命令
-------------------------------------------------------------
45 22 * * * 命令 每天 22 点 45 分执行命令
0 17 * * 1 命令 每周 1 的 17 点 0 分执行命令
0 5 1,15 * * 命令 每月 1 号和 15 号的凌晨 5 点 0 分执行命令
40 4 * * 1-5 命令 每周一到周五的凌晨 4 点 40 分执行命令
*/10 4 * * * 命令 每天的凌晨 4 点,每隔 10 分钟执行一次命令
0 0 1,15 * 1 命令 每月 1 号和 15 号,每周 1 的 0 点 0 分都会执行命令。注意:星期几和几号最好不 要同时出现,因为他们定义的都是天。非常容易让管理员混乱。
RPM软件包管理
查询:
rpm -qa (功能描述:查询所安装的所有 rpm 软件包)
rpm -qi 包名
---------------
卸载:
rpm -e RPM软件包
rpm -e --nodeps 软件包(卸载软件时,不检查依赖)
---------------
安装:
rpm -ivh RPM 包全名
---------------
-e 卸载软件包
-i 安装
-v 显示详细信息
-h 进度条
--nodeps 不检查依赖
yum安装
-y 对所有提问都回答“yes”
install 安装 rpm 软件包
update 更新 rpm 软件包
check-update 检查是否有可用的更新 rpm 软件包
remove 删除指定的 rpm 软件包
list 显示软件包信息
clean 清理 yum 过期的缓存
deplist 显示 yum 软件包的所有依赖关系
----------------------------------------
修改源
----------------------------------------
默认的系统 YUM 源,需要连接国外 apache 网站,网速比较慢,可以修改关联的网络
YUM 源为国内镜像的网站,比如网易 163,aliyun 等
1.安装 wget, wget 用来从指定的 URL 下载文件
[root@hadoop101 ~] yum install wget
2.在/etc/yum.repos.d/目录下,备份默认的 repos 文件,
[root@hadoop101 yum.repos.d] pwd
[root@hadoop101 yum.repos.d] cp CentOS-Base.repo CentOS-Base.repo.backup
3.下载网易 163 或者是 aliyun 的 repos 文件,任选其一,如图 8-2
[root@hadoop101 yum.repos.d] wget
http://mirrors.aliyun.com/repo/Centos-7.repo //阿里云
[root@hadoop101 yum.repos.d] wget
http://mirrors.163.com/.help/CentOS7-Base-163.repo //网易 163
4.使用下载好的 repos 文件替换默认的 repos 文件
例如:用 CentOS7-Base-163.repo 替换 CentOS-Base.repo
[root@hadoop101 yum.repos.d]# mv CentOS7-Base-163.repo CentOS-Base.repo
5.清理旧缓存数据,缓存新数据
[root@hadoop101 yum.repos.d]#yum clean all
[root@hadoop101 yum.repos.d]#yum makecache
yum makecache 就是把服务器的包信息下载到本地电脑缓存起来
6.测试
[root@hadoop101 yum.repos.d]# yum list | grep firefox
[root@hadoop101 ~]#yum -y install firefox
Shell
Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g3JPFnth-1677034574909)(null)]
Linux 提供的 Shell 解析器有
cat /etc/shells
---------------
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
变量范围更改
首先自定义一个局部变量:
my_var="Hello,world"
提升为全局变量
export my_var
(只在子shell里面有效)
$符号的使用
$n位置参数
$n (功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
--------------------------------------------
#!bin/bash
echo script name: $0 当前文件名
echo 1st paramater: $1 输出第一个参数
echo 2nd paramater: $2 输出第二个参数
$#获取输入参数个数
$# (功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)
---------------------------------------------
echo paramater numbers: $#
∗ 、 *、 ∗、@
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
---------------------------------------------------------------
$?
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一
个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明
上一个命令执行不正确了。)
---------------------------------------------------------------------
[11@hadoop101 shells]$ ./helloworld.sh
hello world
[11@hadoop101 shells]$ echo $?
0
运算符
expr 1+2
expr 1 + 2
expr 5 - 3
expr 5 \* 2
--------------------------------
“$((运算式))” 或 “$[运算式]”
a=$(expr 5\*2)
a=`expr 5\*4`
echo $[5*2]
echo S((5*2))
--------------------------------
计算(2+3)* 4 的值
[atguigu@hadoop101 shells]# S=$[(2+3)*4]
[atguigu@hadoop101 shells]# echo $S
条件判断
基本语法
(1)test condition
(2)[ condition ](注意 condition 前后要有空格)
注意:条件非空即为 true,[ atguigu ]返回 true,[ ] 返回 false
---------------------------------------------------------
常用判断条件
(1)两个整数之间比较
-eq 等于(equal) -ne 不等于(not equal)
-lt 小于(less than) -le 小于等于(less equal)
-gt 大于(greater than) -ge 大于等于(greater equal)
注:如果是字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等。
注:当两个判断条件在一个方括号内时,使用-a表达&&,使用-o表达||
----------------------------------------------------------
(2)按照文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
如:[ -r hello.sh ]
----------------------------------------------------------
(3)按照文件类型进行判断
-e 文件存在(existence)
-f 文件存在并且是一个常规的文件(file)
-d 文件存在并且是一个目录(directory)
-----------------------------------------------------------
多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
a=15
[ $a -lt 20 ] && echo "$a < 20" || echo "$a > 20"
流程控制
if分支
(1)单分支
if [ 条件判断式 ];then
程序
fi
if [ 条件判断式 ]
then
程序
fi
(2)多分支
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
①[ 条件判断式 ],中括号和条件判断式之间必须有空格
②if 后要有空格
注意在判断等式时,可能出现期待一元表达式
#!/bin/bash
if [ $1 = atguigu ]
then
echo "welcome"
fi
------------当没有输入时报错"期待一元表达式",正确如下---------------
#!/bin/bash
if [ "$1"x = "atguigu"x ]
then
echo "welcome"
fi
case语句
case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
(1)case 行尾必须为单词“in”,每一个模式匹配必须以右括号 )结束。
(2)双分号“;;”表示命令序列结束,相当于 java 中的 break。
(3)最后的“*)”表示默认模式,相当于 java 中的 default。
#!/bin/bash
case $1 in
1)
echo "one"
;;
2)
echo "two"
;;
3)
echo "three"
;;
*)
echo "number else"
;;
esac
for循环
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
for 变量 in 值 1 值 2 值 3…
do
程序
done
1+2+3+.....+i
-----------------------------------
#!/bin/bash
sum=0
for (( i=1;i<=$1;i++ ))
do
sum=$[ $sum + $i ]
done
echo $sum
------------------------------------
for os in linux windows macos; do echo $os; done
------------------------------------
for i in {1..100}
do
sum=$[$sum+$i]
done
echo $sum
{}序列
从1-100的序列
{1..100}
while循环
while [ 条件判断式 ]
do
程序
done
#!/bin/bash
a=1
while [ $a -le $1 ]
do
sum=$[$sum+$a]
a=$[$a+1]
done
echo $sum
-----------另一种写法---------------
#!/bin/bash
a=1
while [ $a -le $1 ]
do
let sum+=a
let a++
done
echo $sum
read读取控制台输入
read (选项) (参数)
①选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)如果-t 不加表示一直等待
②参数:
变量:指定读取值的变量名
---------------------------------------------------
#!/bin/bash
read -t 10 -p "请输入学号:" number
echo "welcome $number"
系统函数
#!/bin/bash
filename="$1"_log_$(date +%s)
echo $filename
------------------
date +%s(时间戳)
basename
basename [string / pathname] [suffix]
(功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
basename 可以理解为取路径里的文件名称
选项:
suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
截取该/home/atguigu/banzhang.txt 路径的文件名称。
basename /home/atguigu/banzhang.txt
basename /home/atguigu/banzhang.txt .txt
dirname
dirname 可以理解为取文件路径的绝对路径名称
[atguigu@hadoop101 ~]$ dirname /home/atguigu/banzhang.txt
/home/atguigu
自定义函数
[ function ] funname[()]
{
Action;
[return int;]
}
-------------------------------------------
函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,
将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)
实现文件的归档
--------------------------------------------------
#!/bin/bash
#首先判断输入参数个数是否为1,输入的是一个路径名
if [ $# -ne 1 ]
then
echo "参数个数错误!应该输入一个参数,作为归档目录名"
exit
fi
# 从参数中获取目录名称
if [ -d $1 ]
then
echo
else
echo "目录不存在"
echo
exit
fi
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1);pwd)
# 获取当前日期
DATE=$(date +%y%m%d)
# 定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE
# 开始归档文件
echo "开始归档..."
echo
tar -czf $DEST $DIR_PATH/$DIR_NAME
if [$? -eq 0]
then
echo
echo "归档成功"
echo "归档文件为: $DEST"
echo
else
echo "归档出现问题!"
echo
fi
exit
正则表达式
1.常规匹配
| grep
2.常用特殊字符
(1)^ 匹配一行的开头
cat /etc/passwd | grep ^a
-----------------------------
以a开头的行
(2)$ 匹配一行的结束
cat /etc/passwd | grep t$
-----------------------------
匹配所有以t结尾的行
(3). 匹配一个任意的字符
cat /etc/passwd | grep r..t
-----------------------------
r和t中间有两个字符的行
(4)* 某一字符出现任意次
cat /etc/passwd | grep ro*t
------------------------------
可以匹配到root和rot
------------------------------
.*
表示任意字符出现任意次数
(5)[] 字符的区间
[6,8]--------匹配6或8
[0-9]--------匹配一个0-9的数字
[0-9]*-------匹配任意长度的数字字符串
[a-z]--------匹配一个a-z之间的字符
[a-z]*-------匹配任意长度的
[a-c,e-f]----匹配a-c或e-f之间的任意字符
-----------------------------------
cat /etc/passwd | grep r[a,b]t
-----------------------------------
匹配rat或者rbt
(6)\ 转义
cat /etc/passwd | grep '\$'
手机号匹配
| grep ^1[345678][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$
| grep -E ^1[345678][0-9]{9}$
文本处理工具
cut
cut [选项参数] filename
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列,默认是制表符“\t”
-c 按字符进行切割 后加加 n 表示取第几列 比如 -c 1
awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开
的部分再进行分析处理
awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2}...’ filename
pattern:表示 awk 在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
-F 指定输入文件分隔符
-v 赋值一个用户定义变量
------------------------------------------
cat /etc/passwd | grep ^root | cut -d ":" -f 1,7
cat /etc/passwd | awk -F ":" '/^root/{print $1","$7}'
只显示/etc/passwd 的第一列和第七列,以逗号分割,且在所有行前面添加列名 user,shell 在最后一行添加"dahaige,/bin/zuishuai"
-----------------------------------------------------------------------
cat /etc/passwd | awk -F ":" 'BEGIN{print "user,shell"}{print $1","$7} END{print "end of file"}'
cat /etc/passwd | awk -v i=1 -F ":" '{print $3+i}'
awk内置变量
FILENAME 文件名
NR 已读的记录数(行号)
NF 浏览记录的域的个数(切割后,列的个数)
综合案例
我们可以利用 Linux 自带的 mesg 和 write 工具,向其它用户发送消息。
需求:实现一个向某个用户快速发送消息的脚本,输入用户名作为第一个参数,后面直
接跟要发送的消息。脚本需要检测用户是否登录在系统中、是否打开消息功能,以及当前发
送消息是否为空。
#!/bin/bash
# 查看用户是否登录
login_user=$(who | grep -i -m 1 $1 | awk '{print $1}')
if [ -z $login_user ]
then
echo "$1 不在线!"
echo "脚本退出.."
exit
fi
# 查看用户是否开启消息功能
is_allowed=$(who -T | grep -i -m 1 $1 | awk '{print $2}')
if [ $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 $whole_msg | write $login_user $user_terminal
if [ $? != 0 ]
then
echo "发送失败!"
else
echo "发送成功!"
fi
exit
本文作者:Swaynie
本文链接:https://www.cnblogs.com/swaynie/p/17170671.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本